Администрирование PHP: контроль статуса и производительности
Методы определения статуса PHP
Мониторинг состояния PHP необходим для своевременного выявления проблем с производительностью, конфигурацией и доступностью сервиса. Ниже рассмотрены основные способы получения информации о версии, расширениях, работоспособности PHP-FPM и общем состоянии окружения.
Настройка статусной страницы PHP-FPM через pm.status_path
Как получить детальную информацию о пуле PHP-FPM в реальном времени?
Это решение предоставляет данные о количестве активных, простаивающих процессов, общей нагрузке и времени работы. Для включения необходимо отредактировать файл пула (обычно www.conf):
pm.status_path = /status
Затем перезагрузить PHP-FPM:
sudo systemctl reload php8.1-fpm
Далее настроить веб-сервер для передачи запросов на этот путь. Пример для Nginx:
location /status {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
allow 127.0.0.1;
deny all;
}
После этого проверить доступность командой:
curl http://localhost/status
Возможные проблемы и ошибки:
- Ошибка 404: путь не совпадает с
pm.status_pathили блок location не настроен. - Доступ только с localhost: необходимо добавить
allowдля IP мониторирующей системы. - Пустой ответ: PHP-FPM не перезагружен после изменений или используется неверный сокет.
Цель использования: интеграция с системами мониторинга (Zabbix, Nagios) и быстрая диагностика пула процессов.
Использование phpinfo()
Как быстро увидеть полную конфигурацию PHP со всеми расширениями, директивами и путями?
Создайте файл info.php с содержимым:
<?php phpinfo();
Откройте в браузере http://ваш-сайт/info.php. Вывод включает версию, загруженные расширения, переменные окружения и многое другое.
- Утечка конфиденциальных данных: не оставляйте
info.phpв рабочей среде. Удалите или ограничьте доступ. - Медленная загрузка: функция выводит много данных, что может быть неудобно при частом использовании.
Цель: быстрая одноразовая проверка параметров при настройке или поиске совместимости.
Командная строка: php -v, php -m, php -i
Как получить информацию о PHP без запуска веб-сервера?
Эти команды доступны в терминале и не требуют браузера. Примеры:
php -v
php -m
php -i | grep memory
Первая команда выводит версию, вторая - список модулей, третья - извлекает строки с памятью из полной конфигурации.
- Разная версия CLI и веб-модуля: команда
php -vпоказывает версию CLI, которая может отличаться от версии, используемой веб-сервером. - Отсутствие некоторых расширений: вывод
php -mможет не показывать расширения, загруженные только в режиме FPM.
Цель: быстрая диагностика на сервере, автоматизация скриптами.
Скрипт проверки работоспособности (health check)
Как создать собственный скрипт для мониторинга, который проверяет не только версию, но и критические функции?
Пример простого скрипта health.php:
<?php
$status = [
'version' => phpversion(),
'extensions' => get_loaded_extensions(),
'memory_limit' => ini_get('memory_limit'),
'time' => date('Y-m-d H:i:s')
];
header('Content-Type: application/json');
echo json_encode($status, JSON_PRETTY_PRINT);
Запрос через curl:
curl http://localhost/health.php
- Несоответствие конфигурации: скрипт использует
ini_get, но не проверяет, что директива разрешена для изменения. - Ложные срабатывания: если сервер перегружен, скрипт может отработать, но реальная производительность будет низкой. Рекомендуется добавить тест соединения с БД и эмуляцию нагрузки.
Цель: интеграция в систему мониторинга с кастомными проверками.
Проверка службы PHP-FPM через systemd
Как убедиться, что PHP-FPM запущен и работает без ошибок?
Выполните:
systemctl status php8.1-fpm
Вывод включает строку Active: active (running) и последние записи лога. Для проверки только статуса:
systemctl is-active php8.1-fpm
- Разные версии PHP: имя службы может отличаться (например,
php-fpm.service). - Некорректный статус: если служба запущена, но не отвечает на запросы, systemd покажет
active. Дополнительно нужно проверять статусную страницу PHP-FPM.
Цель: быстрая проверка службы системным администратором.
Расширенные примеры кода и сценарии
В этом разделе приведены более детальные примеры с выводом, которые помогут глубже понять инструменты мониторинга статуса PHP.
Полный health check скрипт с параметрами
Скрипт проверяет версию PHP, наличие критических расширений, время выполнения и соединение с MySQL (если доступно).
<?php
header('Content-Type: application/json; charset=utf-8');
$result = [
'php_version' => phpversion(),
'extensions_loaded' => get_loaded_extensions(),
'missing_required' => [],
'memory_limit' => ini_get('memory_limit'),
'execution_time' => ini_get('max_execution_time'),
'upload_max_filesize' => ini_get('upload_max_filesize'),
'time' => date('Y-m-d H:i:s'),
'mysql_connection' => false
];
// Проверка необходимых расширений
$required = ['json', 'mysqli', 'mbstring', 'curl'];
foreach ($required as $ext) {
if (!extension_loaded($ext)) {
$result['missing_required'][] = $ext;
}
}
// Проверка соединения с MySQL (если заданы переменные окружения)
$db_host = getenv('DB_HOST');
$db_user = getenv('DB_USER');
$db_pass = getenv('DB_PASS');
$db_name = getenv('DB_NAME');
if ($db_host && $db_user && $db_name) {
try {
$conn = new mysqli($db_host, $db_user, $db_pass, $db_name);
$result['mysql_connection'] = $conn->connect_error ? false : true;
$conn->close();
} catch (Exception $e) {
$result['mysql_connection'] = false;
}
}
echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
Пример вывода (при успешном выполнении):
{
"php_version": "8.1.27",
"extensions_loaded": [
"Core",
"date",
"json",
...
"mysqli",
"mbstring",
"curl"
],
"missing_required": [],
"memory_limit": "256M",
"execution_time": "30",
"upload_max_filesize": "64M",
"time": "2025-03-15 14:22:10",
"mysql_connection": true
}
Мониторинг статуса PHP-FPM через сокет с помощью скрипта на PHP
Скрипт подключается к Unix-сокету PHP-FPM, отправляет запрос на статус и парсит ответ.
<?php
$socketPath = '/run/php/php8.1-fpm.sock';
$statusPath = '/status';
$request = "GET $statusPath HTTP/1.0\r\nHost: localhost\r\n\r\n";
$socket = @stream_socket_client("unix://$socketPath", $errno, $errstr, 5);
if (!$socket) {
echo "Ошибка подключения: $errstr ($errno)";
exit(1);
}
fwrite($socket, $request);
$response = stream_get_contents($socket);
fclose($socket);
// Отделяем заголовки от тела
list($headers, $body) = explode("\r\n\r\n", $response, 2);
if (strpos($headers, '200 OK') === false) {
echo "Статус-страница недоступна. Код: " . $headers;
exit(1);
}
echo $body;
Пример фрагмента вывода (формат plain):
pool: www process manager: dynamic start time: 15/Mar/2025:12:00:00 +0300 start since: 3600 accepted conn: 54321 listen queue: 0 max listen queue: 5 listen queue len: 128 idle processes: 5 active processes: 12 total processes: 17 max active processes: 20 max children reached: 0 slow requests: 2
Использование функции phpversion() с детальным выводом
Эта функция возвращает не только основную версию, но и дополнительную информацию через константу PHP_EXTRA_VERSION.
<?php
echo 'PHP Version: ' . phpversion() . "\n";
echo 'Full version string: ' . PHP_VERSION . "\n";
echo 'Extra info: ' . (defined('PHP_EXTRA_VERSION') ? PHP_EXTRA_VERSION : 'нет') . "\n";
echo 'Zend Engine Version: ' . zend_version() . "\n";
echo 'Operating System: ' . PHP_OS . "\n";
Результат на сервере с PHP 8.1.27 (пример):
PHP Version: 8.1.27 Full version string: 8.1.27 Extra info: нет Zend Engine Version: 4.1.27 Operating System: Linux
Проверка загруженных расширений с деталями
Использование get_loaded_extensions(true) возвращает не только имена, но и Zend-расширения (опкодные кеши и т.п.).
<?php
$extensions = get_loaded_extensions(true);
echo "Загруженные расширения (всего " . count($extensions) . "):\n";
foreach ($extensions as $type => $extList) {
echo "Тип [$type] (" . count($extList) . "): " . implode(', ', $extList) . "\n";
}
Вывод может содержать строку наподобие:
Загруженные расширения (всего 2): Тип [Core] (1): Core Тип [standard] (62): date, json, mbstring, mysqli, curl, ...
Мониторинг через внешние утилиты: пример с Nagios и check_phpfpm
Плагин check_phpfpm использует статусную страницу FPM. Команда проверки:
/usr/lib/nagios/plugins/check_phpfpm -H localhost -u /status -s unix:/run/php/php8.1-fpm.sock
Возможный результат (OK):
OK - PHP-FPM is running. Active processes: 12 | active=12 idle=5 total=17
При возникновении проблем (таймаут, недоступность) плагин вернет CRITICAL и сообщение об ошибке.