Поиск модулей PHP: полное руководство по проверке расширений
Методы поиска модулей PHP
php -m. Она выводит все загруженные расширения в двух колонках: PHP-модули и Zend-модули.php -mPhp включить модуль (включение модуля php)
Пример вывода:[PHP Modules] bcmath calendar Core ctype curl date dom exif fileinfo filter ftp gd gettext hash iconv intl json libxml mbstring mysqli mysqlnd openssl pcntl pcre PDO pdo_mysql pdo_sqlite Phar posix readline Reflection session shmop SimpleXML soap sockets sodium SPL sqlite3 standard sysvmsg sysvsem sysvshm tokenizer xml xmlreader xmlwriter xsl Zend OPcache zip zlib [Zend Modules] Zend OPcache
найти модуль php (поиск модуля php)
which php. Если модуль не отображается, но должен быть включён, загляните в php.ini - возможно, директива extension закомментирована или указан неверный путь.Как проверить, загружен ли конкретный модуль, например mbstring?
Команда php -i выводит всю конфигурацию PHP, а через grep можно отфильтровать нужную строку. Вариант для быстрой проверки:
php -i | grep -i mbstringмодуль php установка модуля php (установка модуля php)
Результат покажет строки, содержащие «mbstring» (регистр не важен). Если ничего не выведено, модуль не загружен.
mbstring, а в выводе mbstring support => enabled. Используйте grep -i для игнорирования регистра.Как получить список модулей из PHP-скрипта?
Функция get_loaded_extensions() возвращает массив имён всех загруженных расширений. Цель - программная проверка в коде приложения.
<?php
$extensions = get_loaded_extensions();
echo 'Загружено модулей: ' . count($extensions) . "\n";
foreach ($extensions as $ext) {
echo $ext . "\n";
}
?>Загружено модулей: 53 bcmath calendar Core ctype curl date dom ...
Как в коде проверить наличие одного модуля?
Функция extension_loaded('имя') возвращает true, если модуль загружен. Это удобно для условного выполнения кода, зависящего от расширения.
<?php
if (extension_loaded('curl')) {
echo 'cURL доступен';
} else {
echo 'cURL не установлен';
}
?>extension_loaded нечувствительна к регистру (mb_string и Mb_String распознаются одинаково). Однако рекомендуется использовать точное имя из списка get_loaded_extensions().Как получить полную информацию о модуле и его настройках?
Вызов phpinfo() выводит огромную страницу с конфигурацией, включая секции по каждому модулю. Цель - детальный анализ.
<?php
phpinfo();
?>Запустите скрипт в браузере или выполните php -i | less в консоли (аналог phpinfo в терминале).
phpinfo() может быть слишком большим. Используйте поиск по странице (Ctrl+F) или фильтрацию через grep: php -i | grep -A20 'module_name'.Как найти физические файлы модулей (so/dll)?
Сначала узнайте директорию расширений через php -i | grep extension_dir. Затем выполните поиск файлов модулей.
ext_dir=$(php -i | grep ^extension_dir | cut -d' ' -f3)
echo "Директория расширений: $ext_dir"
ls -la $ext_dirДиректория расширений: /usr/lib/php/20200930 total 1234 -rw-r--r-- 1 root root 123456 ... opcache.so -rw-r--r-- 1 root root 78901 ... mbstring.so ...
extension_dir может быть пустой или содержать только динамические модули. Статические расширения не имеют отдельного файла.Как проверить, какие модули включены в php.ini?
Проанализируйте файл php.ini на предмет строк extension=.
php --ini | grep 'Loaded Configuration File' | cut -d' ' -f5
cat /etc/php/8.1/cli/php.ini | grep -E '^extension'extension могут быть закомментированы точкой с запятой в начале строки. Если модуль не загружается, проверьте, не закомментирована ли строка. Также учитывайте, что модуль может быть включён через zend_extension или через php.d/*.ini.Дополнительные примеры для поиска PHP-модулей
Эти примеры помогут в более сложных сценариях, когда требуется не просто список, а детальная информация о версиях, зависимостях или особые фильтры.
Проверка модуля с выводом версии и автора
Используя класс ReflectionExtension можно получить метаданные модуля.
<?php
$ext = new ReflectionExtension('mbstring');
echo 'Версия: ' . $ext->getVersion() . PHP_EOL;
echo 'Автор: ' . $ext->getAuthor() . PHP_EOL;
$constants = $ext->getConstants();
echo 'Константы: ' . implode(', ', array_keys($constants)) . PHP_EOL;
?>Версия: 8.1.0 Автор: PHP Group Константы: MB_CASE_UPPER, MB_CASE_LOWER, MB_CASE_TITLE, ...
Поиск всех модулей, начинающихся на «pdo»
php -m | grep -i '^pdo'PDO pdo_mysql pdo_sqlite
Эта команда полезна, когда нужно быстро найти все PDO-драйверы.
Парсинг вывода phpinfo() в HTML с извлечением модулей
Если требуется программно извлечь список модулей из phpinfo (например, если нет доступа к консоли), можно использовать буферизацию вывода.
<?php
ob_start();
phpinfo(INFO_MODULES);
$html = ob_get_clean();
preg_match_all('/<h2><a[^>]+>([^<]+)<\/a><\/h2>/', $html, $matches);
echo 'Модули: ' . implode(', ', $matches[1]);
?>Модули: Core, date, libxml, pcre, sqlite3, zlib, bcmath, bz2, calendar, ctype, curl, ...
get_loaded_extensions(), когда это возможно.Проверка модуля с условной загрузкой кода
Пример класса, который делегирует выполнение в зависимости от доступности модуля.
<?php
class ImageProcessor {
public function resize($file) {
if (extension_loaded('gd')) {
$img = imagecreatefromstring(file_get_contents($file));
$resized = imagescale($img, 100, 100);
return $resized;
} elseif (extension_loaded('imagick')) {
$img = new Imagick($file);
$img->scaleImage(100, 100);
return $img->getImageBlob();
} else {
throw new RuntimeException('Не найден модуль GD или Imagick');
}
}
}
try {
$processor = new ImageProcessor();
$result = $processor->resize('photo.jpg');
echo 'Успешно';
} catch (Exception $e) {
echo 'Ошибка: ' . $e->getMessage();
}
?>Такой подход позволяет не полагаться на один модуль и даёт пользователю понятное сообщение об отсутствии расширения.
Поиск модуля в пользовательской директории
Если расширение собрано вручную и лежит нестандартном месте, можно проверить его наличие с помощью dl() (устарело) или загрузки через ini_set('extension_dir', ...). Однако современный подход - просто поместить .so в стандартную директорию и добавить extension=... в php.ini.
# Пример проверки наличия файла модуля
mod_name='myext.so'
mod_path='/opt/php_extensions/'
if [ -f "$mod_path$mod_name" ]; then
echo 'Файл найден'
else
echo 'Файл не найден'
fiСкрипт для сравнения модулей на разных версиях PHP
Полезно при миграции.
#!/bin/bash
# Сравнить модули PHP 7.4 и PHP 8.1
prev=$(php7.4 -m | sort)
cur=$(php8.1 -m | sort)
diff <(echo "$prev") <(echo "$cur") || echo 'Различий нет'Скрипт выведет строки, которые есть только в одной из версий.