Всесторонняя диагностика PHP: инструменты и практические примеры

Раздел: Администрирование PHP -> Диагностика PHP и настройка

Проверка PHP: основные методы и варианты

Как быстро и надёжно получить информацию о версии и конфигурации PHP?

Наиболее эффективным способом диагностики PHP является использование встроенной функции phpinfo(). Этот метод предоставляет полный отчёт о версии, загруженных расширениях, директивах конфигурации, переменных окружения и многом другом.


<?php
phpinfo();
?>

Шаги выполнения:

  1. Создать файл info.php в корневой директории сайта.
  2. Поместить в него указанный код.
  3. Открыть файл через веб-браузер: http://your-site.com/info.php.
  4. Проанализировать выведенную таблицу.

Типичные ошибки:

  • Файл не открывается – возможно, PHP не установлен или веб-сервер не настроен на обработку PHP. Рекомендуется проверить, выполняется ли PHP через командную строку.
  • Вместо таблицы отображается исходный код – сервер не обрабатывает PHP-файлы. Необходимо установить модуль PHP (например, libapache2-mod-php для Apache).
  • После работы с phpinfo() следует удалить файл, чтобы не раскрывать конфиденциальные данные.

Как проверить версию PHP через командную строку?

Для серверов без веб-интерфейса или для быстрой проверки без создания файла используется консольная команда:


php -v

Результат:

PHP 8.2.12 (cli) (built: Oct 26 2023 16:04:14) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.2.12, Copyright (c) Zend Technologies

Пояснение: команда выводит номер версии, дату сборки и информацию о движке Zend. Этот метод подходит для проверки, активен ли PHP в системе.

Если команда не найдена – PHP не установлен или не добавлен в PATH. На Linux это решается установкой пакета (например, apt install php).

Как проверить синтаксис PHP-файла без выполнения?

Перед развёртыванием кода на продакшене полезно провести синтаксическую проверку. Используется флаг -l:


php -l /путь/к/файлу.php

Пример для файла с ошибкой:


# Файл test.php содержит: <?php echo "Hello"; ?
php -l test.php
Parse error: syntax error, unexpected end of file in test.php on line 1
Errors parsing test.php

Для корректного файла:

No syntax errors detected in test.php

Этот метод позволяет обнаружить пропущенные точки с запятой, незакрытые скобки и другие синтаксические ошибки до выполнения.

Важно: проверяется только синтаксис, а не логические ошибки или runtime-исключения.

Как проверить, какие расширения PHP загружены?

Список активных расширений можно получить двумя способами:

Через командную строку с флагом -m:


php -m
[PHP Modules]
calendar
ctype
curl
date
...
[Zend Modules]
Xdebug

Или программно с помощью функции get_loaded_extensions():


<?php
print_r(get_loaded_extensions());
?>

Пояснение: знание загруженных расширений помогает диагностировать, почему не работают определённые функции (например, отсутствие модуля mysqli вызовет ошибку при подключении к MySQL).

Если нужное расширение отсутствует, его следует установить через пакетный менеджер (например, apt install php-mysql) и перезагрузить веб-сервер.

Как проверить настройки PHP через INI-файл?

Для просмотра значений директив конфигурации используется команда php -i или функция ini_get(). Команда выводит все директивы и их текущие значения:


php -i | grep upload_max_filesize
upload_max_filesize => 64M => 64M

Программный вариант для конкретной директивы:


<?php
echo 'Максимальный размер загружаемого файла: ' . ini_get('upload_max_filesize') . '<br>';
echo 'Максимальное время выполнения: ' . ini_get('max_execution_time') . ' секунд';
?>

Цель: проверка, соответствуют ли настройки требованиям приложения (например, для загрузки больших файлов).

Изменение директив через PHP-скрипт (ini_set()) работает только для текущего запроса, не затрагивая глобальные настройки. Для постоянных изменений правится php.ini или .htaccess (если разрешено).

Как проверить, что PHP работает с веб-сервером?

Создаётся скрипт, который проверяет статус подключения:


<?php
if (function_exists('apache_get_version')) {
    echo 'Веб-сервер: Apache ' . apache_get_version();
} elseif (strpos($_SERVER['SERVER_SOFTWARE'], 'nginx') !== false) {
    echo 'Веб-сервер: Nginx';
} else {
    echo 'Веб-сервер: ' . $_SERVER['SERVER_SOFTWARE'];
}
?>

Этот код показывает, какой веб-сервер обслуживает PHP, и подтверждает, что модуль PHP интегрирован корректно.

Если веб-сервер не отображается, возможно, PHP работает в режиме CGI/FastCGI, и для полноценной диагностики стоит проверить файлы журналов ошибок веб-сервера.

Как проверить журнал ошибок PHP?

Ошибки PHP часто записываются в лог-файлы. Узнать путь к логу можно так:


<?php
echo 'Ошибки логируются в: ' . ini_get('error_log');
?>

Если значение пустое, ошибки, вероятно, выводятся на экран (при display_errors = On) или записываются в системный лог (syslog). Пример просмотра tail:


tail -f /var/log/php_errors.log

Цель: отслеживание runtime-ошибок, предупреждений и уведомлений, которые не видны при обычной работе.

Если файл лога не создаётся, проверяется, доступна ли директория для записи, и установлены ли права. В конфигурации PHP должна быть включена директива log_errors.

Дополнительные примеры проверки PHP

Проверка работы PHP через скрипт с отчётом

Следующий скрипт выводит основные параметры в удобном формате:

Пример

<?php
echo '<h3>Диагностика PHP</h3>';
echo 'Версия: ' . PHP_VERSION . '<br>';
echo 'ОС: ' . PHP_OS . '<br>';
echo 'Максимальное время выполнения: ' . ini_get('max_execution_time') . ' сек<br>';
echo 'Лимит памяти: ' . ini_get('memory_limit') . '<br>';
echo 'Размер загружаемого файла: ' . ini_get('upload_max_filesize') . '<br>';
echo 'Post max size: ' . ini_get('post_max_size') . '<br>';
echo 'Веб-сервер: ' . $_SERVER['SERVER_SOFTWARE'] . '<br>';
echo 'Документ рут: ' . $_SERVER['DOCUMENT_ROOT'];
?>
Версия: 8.2.12
ОС: Linux
Максимальное время выполнения: 30 сек
Лимит памяти: 128M
Размер загружаемого файла: 64M
Post max size: 64M
Веб-сервер: Apache/2.4.57 (Ubuntu)
Документ рут: /var/www/html

Проверка доступности удалённых ресурсов

Если в скрипте используются внешние API, стоит проверить, разрешены ли сетевые соединения:

Пример

<?php
$host = 'api.example.com';
$port = 443;
$connection = @fsockopen($host, $port, $errno, $errstr, 5);
if (is_resource($connection)) {
    echo 'Удалённый хост доступен: ' . $host . ':' . $port;
    fclose($connection);
} else {
    echo 'Ошибка подключения: ' . $errstr . ' (' . $errno . ')';
}
?>
Удалённый хост доступен: api.example.com:443

Пояснение: функция fsockopen проверяет возможность установки TCP-соединения. Это помогает выявить проблемы с брандмауэром или DNS.

Тест производительности выполнения кода

Для оценки скорости работы PHP можно использовать микро-бенчмарк:

Пример

<?php
$start = microtime(true);
// Имитация нагрузки
for ($i = 0; $i < 1000000; $i++) {
    $x = sqrt(123456);
}
$end = microtime(true);
echo 'Время выполнения: ' . round(($end - $start) * 1000, 2) . ' мс';
?>
Время выполнения: 35.12 мс

Этот тест пригодится, чтобы убедиться, что сервер не перегружен и PHP работает с ожидаемой скоростью.

Проверка работы с базой данных MySQL через PDO

Пример

<?php
try {
    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $pdo->query('SELECT VERSION()');
    $row = $stmt->fetch(PDO::FETCH_NUM);
    echo 'Версия MySQL: ' . $row[0];
} catch (PDOException $e) {
    echo 'Ошибка подключения: ' . $e->getMessage();
}
?>
Версия MySQL: 8.0.34

Цель: убедиться, что расширение PDO MySQL установлено и параметры соединения корректны.

Проверка наличия функции и её доступности

Пример

<?php
$func = 'imagecreatetruecolor';
if (function_exists($func)) {
    echo 'Функция ' . $func . ' доступна.';
} else {
    echo 'Функция ' . $func . ' не определена. Возможно, отсутствует расширение GD.';
}
?>
Функция imagecreatetruecolor доступна.

Этот метод полезен, когда приложение ругается на отсутствие определённой функции - проверка подскажет, какое расширение нужно установить.

Проверка временной зоны и работы с датами

Пример

<?php
echo 'Текущая временная зона: ' . date_default_timezone_get() . '<br>';
echo 'Текущее время: ' . date('Y-m-d H:i:s');
?>
Текущая временная зона: Europe/Moscow
Текущее время: 2025-04-08 14:30:05

Некорректная временная зона может привести к ошибкам в логировании и расчетах.

Проверка включённого буферирования вывода

Пример

<?php
if (ob_get_level()) {
    echo 'Буферизация вывода включена, уровень: ' . ob_get_level();
} else {
    echo 'Буферизация вывода выключена.';
}
?>
Буферизация вывода включена, уровень: 1

Пояснение: буферизация может влиять на отправку заголовков и вывод ошибок.

Проверить PHP - comments

En
проверить php (php)