Получение настроек PHP (phpinfo) для диагностики
Способы получения информации о конфигурации PHP
Как получить полную информацию о PHP в веб-окружении?
Основной и наиболее универсальный способ — использование встроенной функции phpinfo(). Она выводит огромный объём данных: версию PHP, загруженные расширения, директивы конфигурации, переменные окружения, HTTP-заголовки и многое другое. Скрипт для этого выглядит так:
<? phpinfo(); ?>
Сохраните этот код в файл info.php в корневой директории веб-сервера. При обращении к этому файлу в браузере отобразится таблица с разделами. Данные удобно просматривать и искать нужные параметры через встроенный поиск браузера.
Типичные проблемы и их решение
- Вывод может быть слишком большим — страница загружается медленно. В таком случае можно ограничить вывод с помощью констант phpinfo(INFO_MODULES) или phpinfo(INFO_CONFIGURATION).
- Если на сервере отключён вывод ошибок, скрипт может не сработать. Проверьте, что файл исполняется через веб-сервер, а не через CLI.
- Из соображений безопасности после диагностики следует удалить файл info.php, чтобы злоумышленники не получили доступ к конфигурации.
Цель использования:
- Быстрая проверка версии PHP и доступных расширений.
- Поиск конкретной директивы, например, upload_max_filesize.
- Сравнение настроек разных окружений.
Как получить информацию о PHP без веб-сервера?
Если веб-сервер не запущен или доступен только терминал, используется команда php -i (аналог phpinfo() в CLI). Выполните в консоли:
php -i
Вывод аналогичен веб-версии, но без HTML-форматирования. Для поиска по выводу можно применить grep:
php -i | grep upload_max_filesize
Типичные ошибки
- Команда не найдена — PHP не установлен в PATH. Укажите полный путь к исполняемому файлу.
- Вывод содержит только директивы CLI-режима, которые могут отличаться от веб-режима, если используются разные php.ini.
Когда применяется:
- При диагностике сервера по SSH без веб-интерфейса.
- В автоматизированных скриптах для сбора информации о PHP.
Как получить только определённые директивы или расширения?
Для выборочного получения данных применяются функции phpversion(), ini_get(), get_loaded_extensions() и ini_get_all(). Примеры:
echo 'Версия PHP: ' . phpversion();
echo 'Максимальный размер загрузки: ' . ini_get('upload_max_filesize');
print_r(get_loaded_extensions());
print_r(ini_get_all());
Возможные затруднения
- Функция ini_get() возвращает строку, для логических директив — пустую строку или '0'. Требуется преобразование.
- Список расширений может быть неполным, если расширение загружено динамически.
Случаи использования:
- Программная проверка наличия необходимого расширения (например, PDO).
- Вывод конкретного параметра без лишней информации.
- Интеграция в панель управления для отображения настроек.
Как получить все директивы из файла php.ini?
Файл конфигурации можно прочитать вручную или с помощью parse_ini_file(). Укажите путь к php.ini (обычно он отображается в выводе phpinfo()):
$ini = parse_ini_file('/etc/php/8.1/cli/php.ini', true);
print_r($ini);
Проблемы
- Не все директивы содержатся в php.ini; многие устанавливаются по умолчанию или переопределяются в других конфигурационных файлах (.user.ini, .htaccess).
- Функция не обрабатывает системные значения, возвращаемые только через ini_get().
Применение:
- Получение исходных настроек для сравнения с текущими.
- Автоматический аудит конфигурации.
Как программно обработать вывод phpinfo()?
Чтобы сохранить или проанализировать данные из phpinfo(), используется буферизация через ob_start(). Это позволяет перехватить HTML-вывод и работать с ним как со строкой:
ob_start();
phpinfo();
$html = ob_get_clean();
echo strip_tags($html); // удалить HTML-теги
Сложности
- Разбор HTML-таблиц требует дополнительных регулярных выражений или парсеров.
- Из-за большого объёма данных буферизация может потреблять много памяти.
Когда это нужно:
- Для создания собственного отчёта о конфигурации в нестандартном формате (JSON, XML).
- Для интеграции с системами мониторинга.
Расширенные примеры работы с информацией о PHP
Парсинг вывода phpinfo() с извлечением разделов
Пример получения только раздела о модулях с помощью регулярного выражения:
ob_start();
phpinfo(INFO_MODULES);
$html = ob_get_clean();
// Удаление разметки и извлечение текста модулей
$modules = strip_tags($html);
echo $modules;
module_name module_name ... (сокращено)
Пояснение:
Константа INFO_MODULES ограничивает вывод только данными о расширениях. После буферизации строка очищается от HTML - остаётся чистый текст, который можно сохранить или проанализировать.
Сравнение двух конфигураций с помощью phpinfo(INFO_GENERAL)
Скрипт выводит только общую информацию (версию, дату сборки, путь к php.ini) в простом текстовом формате:
ob_start();
phpinfo(INFO_GENERAL);
$html = ob_get_clean();
// Удаляем HTML-теги и лишние пробелы
$plain = preg_replace('/\s+/', ' ', strip_tags($html));
echo $plain;
PHP Version => 8.1.12 System => Linux server Build Date => Dec 1 2022 12:00:00 ...
Такой формат удобно сравнивать с помощью diff.
Получение списка расширений с версиями
Функции get_loaded_extensions() и phpversion() для каждого расширения:
$extensions = get_loaded_extensions();
sort($extensions);
foreach ($extensions as $ext) {
echo $ext . ' => ' . phpversion($ext) . PHP_EOL;
}
curl => 7.87.0 date => 8.1.12 gd => 2.3.3 pdo => 8.1.12 ...
Вывод всех директив конфигурации с типом значения
ini_get_all() возвращает массив с описанием каждой директивы, включая глобальное и локальное значение:
$directives = ini_get_all();
echo 'Директива | Глобальное | Локальное' . PHP_EOL;
foreach ($directives as $key => $value) {
echo $key . ' | ' . $value['global_value'] . ' | ' . $value['local_value'] . PHP_EOL;
}
allow_url_fopen | 1 | 1 date.timezone | Europe/Moscow | Europe/Moscow upload_max_filesize | 64M | 64M ...
Использование phpinfo() в командной строке с выводом в файл
Команда для сохранения полной информации в текстовый файл:
php -i > php_info.txt
Затем файл можно проанализировать любым текстовым редактором.
Сбор информации через PHP-скрипт в формате JSON
Пример создания собственного отчёта в JSON:
$info = [
'version' => phpversion(),
'extensions' => get_loaded_extensions(),
'directives' => [
'upload_max_filesize' => ini_get('upload_max_filesize'),
'post_max_size' => ini_get('post_max_size'),
'memory_limit' => ini_get('memory_limit'),
],
'sapi' => php_sapi_name(),
];
echo json_encode($info, JSON_PRETTY_PRINT);
{
"version": "8.1.12",
"extensions": ["curl", "date", "gd", "pdo", ...],
"directives": {
"upload_max_filesize": "64M",
"post_max_size": "128M",
"memory_limit": "256M"
},
"sapi": "cli"
}
Динамическая проверка наличия расширения с обработкой ошибки
Пример надёжной проверки перед использованием:
$required = ['pdo', 'mbstring', 'gd'];
$loaded = get_loaded_extensions();
$missing = array_diff($required, $loaded);
if (!empty($missing)) {
echo 'Отсутствуют расширения: ' . implode(', ', $missing);
} else {
echo 'Все необходимые расширения загружены.';
}
Все необходимые расширения загружены.
Такой подход применяется в инсталляторах CMS.