Администрирование PHP: контроль статуса и производительности

Раздел: Администрирование PHP -> Статус и мониторинг 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 и сообщение об ошибке.

Статус PHP - comments

En
Php status (php)