Как проверить установленные модули PHP
Варианты просмотра модулей PHP
Как получить полную информацию о всех установленных модулях PHP в веб-среде?
Самый простой способ – использовать встроенную функцию phpinfo(). Она выводит детальную информацию о конфигурации PHP, включая все загруженные модули, их версии, настройки и авторов.
Пример кода:
<?php
phpinfo();
?>После запуска этого скрипта на веб-сервере откроется страница с таблицами. Раздел с информацией о модулях называется "Module Authors" и "PHP Credits". Для каждого модуля отображаются его функции и параметры.
Типичные проблемы и ошибки:
- Функция phpinfo() выводит много данных, что может затруднить поиск конкретного модуля. Рекомендуется использовать phpinfo(INFO_MODULES) для вывода только информации о модулях.
- На production-серверах функция может быть отключена директивой disable_functions. В таком случае следует обратиться к администратору или использовать другие способы.
Как программно получить список загруженных модулей в коде PHP?
Функция get_loaded_extensions() возвращает массив имён всех загруженных модулей. Это удобно для автоматической проверки.
<?php
$extensions = get_loaded_extensions();
print_r($extensions);
?>Результат:
Array
(
[0] => Core
[1] => date
[2] => libxml
[3] => openssl
[4] => pcre
[5] => json
// ... и другие
)Возможные сложности:
- Функция не покажет модули, которые не загружены (например, установлены, но отключены в php.ini). Для проверки наличия конкретного модуля используйте extension_loaded().
- Массив может содержать псевдонимы модулей, что иногда вводит в заблуждение.
Как проверить, загружен ли конкретный модуль PHP?
Для точечной проверки используется функция extension_loaded(). Она принимает имя модуля (строку) и возвращает true или false.
<?php
if (extension_loaded('mbstring')) {
echo 'Модуль mbstring загружен';
} else {
echo 'Модуль mbstring не загружен';
}
?>Этот подход часто применяется в требованиях приложений (например, WordPress, Laravel).
Ошибки:
- Имя модуля чувствительно к регистру (обычно нижний регистр).
- Если модуль является частью ядра (Core), extension_loaded('Core') вернёт true, но это не всегда полезно.
Как вывести список модулей из командной строки?
Утилита php -m в терминале показывает все скомпилированные или загруженные модули PHP CLI. Этот способ не зависит от веб-сервера.
php -mПример результата:
[PHP Modules] Core date libxml openssl pcre json ... [Zend Modules] Xdebug
Особенности:
- Вывод относится только к версии PHP, используемой в командной строке. Для веб-версии может быть отдельный php.ini, поэтому модули могут отличаться.
- Для просмотра модулей, доступных для веб-сервера, можно выполнить php -m в том же окружении, что и веб (например, через SSH на сервере).
Как узнать версию конкретного модуля PHP?
Функция phpversion() с указанием имени модуля возвращает его версию. Если модуль не загружен, возвращается false.
<?php
echo phpversion('mbstring'); // выведет "7.4.33" или false
?>Это полезно для проверки совместимости модуля с версией PHP.
Потенциальная проблема:
Для модулей, не имеющих собственной версии (например, Core), функция может вернуть общую версию PHP.
Расширенные примеры работы с информацией о модулях PHP
Ниже приведены более сложные сценарии, которые позволяют получить детальные данные о модулях, их функциях и настройках.
Получение списка функций конкретного модуля через ReflectionExtension
Класс ReflectionExtension предоставляет API для анализа модулей. Можно получить не только имя, но и описание, версию, список функций, классы и константы, определённые модулем.
<?php
$ext = new ReflectionExtension('mbstring');
echo 'Имя модуля: ' . $ext->getName() . "\n";
echo 'Версия: ' . $ext->getVersion() . "\n";
$functions = $ext->getFunctions();
echo 'Функции (' . count($functions) . "):\n";
foreach ($functions as $func) {
echo ' - ' . $func->getName() . "\n";
}
?>Результат выполнения скрипта:
Имя модуля: mbstring Версия: 7.4.33 Функции (59): - mb_strlen - mb_strpos - mb_stristr - ...
Этот способ идеален для создания документации или динамического анализа доступных возможностей.
Извлечение информации о модулях из вывода phpinfo() в структурированном виде
Иногда нужно получить данные, которые есть только в phpinfo(), но в текстовом формате. Для этого можно использовать буферизацию вывода и регулярные выражения.
<?php
ob_start();
phpinfo(INFO_MODULES);
$info = ob_get_clean();
// Извлекаем названия модулей
preg_match_all('/<h2><a name="module_([^"]+)">/', $info, $matches);
$modules = $matches[1];
print_r($modules);
?>Результат:
Array
(
[0] => Core
[1] => date
[2] => libxml
[3] => openssl
...
)Однако такой подход хрупок и зависит от версии PHP. Лучше использовать get_loaded_extensions() для базового списка.
Сравнение модулей, загруженных в CLI и веб-версии PHP
На одном сервере могут быть разные php.ini для CLI и веб-сервера. Для выявления расхождений можно выполнить скрипт, который выводит модули через веб, и сравнить с выводом php -m.
<?php
// Веб-скрипт: выводит модули в формате JSON
header('Content-Type: application/json');
echo json_encode(get_loaded_extensions());
?>Затем в CLI:
curl http://localhost/modules.php | jq .И сравнить с:
php -m | awk '/^[a-zA-Z]/ {print $1}'Различия укажут на несовпадение конфигураций. Это помогает при отладке проблем, когда приложение работает в CLI, но не в вебе.
Получение параметров ini-файла конкретного модуля
Многие модули добавляют свои директивы в php.ini. Для просмотра их значений используется ini_get() или ini_get_all() с указанием модуля.
<?php
// Получить все ini-директивы модуля xdebug
if (extension_loaded('xdebug')) {
$xdebug_ini = ini_get_all('xdebug');
foreach ($xdebug_ini as $name => $value) {
echo "$name = {$value['local_value']}\n";
}
}
?>Результат:
xdebug.mode = develop xdebug.start_with_request = default xdebug.output_dir = /tmp ...
Это полезно для проверки настроек отладки или оптимизации.
Автоматическая генерация отчёта о всех модулях с версиями и статусами
Скрипт, который собирает все загруженные модули, их версии, а также проверяет, включены ли они (через extension_loaded). Результат можно вывести в виде таблицы.
<?php
echo "<table border='1'>";
echo "<tr><th>Модуль</th><th>Версия</th><th>Загружен</th></tr>";
$extensions = get_loaded_extensions();
sort($extensions);
foreach ($extensions as $ext) {
$version = phpversion($ext) ?: 'нет версии';
$loaded = extension_loaded($ext) ? 'Да' : 'Нет';
echo "<tr><td>$ext</td><td>$version</td><td>$loaded</td></tr>";
}
echo "</table>";
?>Результат – HTML-таблица со всеми модулями, отсортированными по алфавиту. Этот отчёт можно использовать для аудита сервера.