Поиск модулей PHP: полное руководство по проверке расширений

Раздел: Администрирование PHP -> Управление модулями PHP

Методы поиска модулей PHP

Самый быстрый и надёжный способ проверить список установленных модулей - выполнить в терминале команду php -m. Она выводит все загруженные расширения в двух колонках: PHP-модули и Zend-модули.
php -m

Php включить модуль (включение модуля 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)

Если команда не найдена, вероятно, PHP не установлен или не добавлен в переменную окружения PATH. Проверьте установку: which php. Если модуль не отображается, но должен быть включён, загляните в php.ini - возможно, директива extension закомментирована или указан неверный путь.

Как проверить, загружен ли конкретный модуль, например mbstring?

Команда php -i выводит всю конфигурацию PHP, а через grep можно отфильтровать нужную строку. Вариант для быстрой проверки:

php -i | grep -i mbstring

модуль php установка модуля php (установка модуля php)

Результат покажет строки, содержащие «mbstring» (регистр не важен). Если ничего не выведено, модуль не загружен.

Ошибка: grep не находит модуль из-за несовпадения имени. Например, модуль может называться 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
...
Функция показывает только те модули, которые реально загружены, а не включены в php.ini, но по какой-то причине не активированы. Если модуль не загружается из-за ошибки компиляции, он тоже не попадёт в список. Ошибки загрузки можно увидеть в логах PHP.

Как в коде проверить наличие одного модуля?

Функция 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
...
Иногда модули собраны статически в составе PHP и .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, ...
Регулярное выражение может не работать в разных версиях PHP, так как структура phpinfo() изменяется. Лучше использовать 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 'Различий нет'

Скрипт выведет строки, которые есть только в одной из версий.

Поиск модуля PHP - comments

En
найти модуль php (php)