Всесторонняя диагностика PHP: инструменты и практические примеры
Проверка PHP: основные методы и варианты
Как быстро и надёжно получить информацию о версии и конфигурации PHP?
Наиболее эффективным способом диагностики PHP является использование встроенной функции phpinfo(). Этот метод предоставляет полный отчёт о версии, загруженных расширениях, директивах конфигурации, переменных окружения и многом другом.
<?php
phpinfo();
?>
Шаги выполнения:
- Создать файл info.php в корневой директории сайта.
- Поместить в него указанный код.
- Открыть файл через веб-браузер: http://your-site.com/info.php.
- Проанализировать выведенную таблицу.
Типичные ошибки:
- Файл не открывается – возможно, 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
Пояснение: буферизация может влиять на отправку заголовков и вывод ошибок.