Список и управление модулями PHP
Основные способы управления модулями PHP
Как быстро установить и активировать необходимый модуль PHP?
Наиболее эффективный способ для большинства серверов под управлением Debian/Ubuntu - использование менеджера пакетов apt. Это позволяет установить модуль вместе со всеми зависимостями и автоматически включить его.
sudo apt update
sudo apt install php-mysql php-json php-mbstring php-xml php-gdнеобходимые модули php (необходимые модули php)
После установки модуль обычно активируется автоматически. Для проверки используйте:
php -m | grep -i mysql
Если модуль отобразился в списке, он готов к работе. В противном случае проверьте, что установлена правильная версия модуля (например, php7.4-mysql для PHP 7.4).
Проблема: модуль не загружается после установки. Решение: убедитесь, что в php.ini нет директивы disable_functions, блокирующей загрузку, и что веб-сервер перезапущен:
sudo systemctl restart apache2 # или nginx + php-fpm
Типичная ошибка: конфликт версий модуля и PHP. Например, попытка установить php8.1-mysql при PHP 8.2. Всегда проверяйте совместимость:
php -v
dpkg -l | grep php.*mysql
Как скомпилировать PHP с нужными модулями из исходного кода?
Этот вариант подходит, когда необходимо нестандартное расширение, отсутствующее в официальных репозиториях, или требуется особая конфигурация компиляции. Скачайте исходники, настройте сборку и запустите make.
wget https://www.php.net/distributions/php-8.2.15.tar.gz
tar xzf php-8.2.15.tar.gz
cd php-8.2.15
./configure --with-mysqli --with-pdo-mysql --enable-mbstring --with-gd --with-openssl
make -j $(nproc)
sudo make install
Цель: получить PHP с конкретным набором встроенных расширений. Когда используется: на серверах без возможности установки пакетов (например, в контейнерах) или для сбора оптимизированной сборки.
Проблема: отсутствие необходимых системных библиотек (например, libmysqlclient). Решение: установите их через apt:
sudo apt install libmysqlclient-dev libssl-dev libgd-dev
Ошибка: конфигурация завершается с сообщением configure: error: Please reinstall the libcurl distribution. Установите libcurl4-openssl-dev.
Как установить расширение через PECL?
PECL (PHP Extension Community Library) - репозиторий внешних расширений. Для установки требуется phpize и компилятор.
sudo apt install php-dev php-pear
sudo pecl install xdebug
После установки PECL сообщает путь к .so файлу и может автоматически добавить extension=xdebug.so в php.ini. Если нет - добавьте вручную.
Цель: установка популярных расширений (Xdebug, igbinary, redis, mongodb). Когда используется: для дополнений, не входящих в дистрибутив PHP.
Проблема: во время компиляции возникает ошибка fatal error: 'php.h' file not found. Решение: установите php-dev соответствующей версии:
sudo apt install php8.2-dev
Другая ошибка: расширение не загружается после установки. Проверьте наличие строки extension=xdebug.so в php.ini и что файл существует:
php -i | grep extension_dir
ls /usr/lib/php/20210902/xdebug.so
Как включить уже установленный модуль через php.ini?
Если модуль физически присутствует в системе (например, скомпилирован или установлен из другого источника), его можно активировать, добавив строку в php.ini.
; /etc/php/8.2/cli/php.ini
extension=mbstring.so
zend_extension=opcache.so
Для веб-сервера обычно используются отдельные конфиги для CLI и FPM - меняйте соответствующий файл. После изменений перезапустите сервер.
Цель: тонкая настройка загрузки модулей, включение модулей, установленных вручную. Когда используется: когда пакетный менеджер не управляет php.ini или требуется отключить/включить определённые расширения без переустановки.
Проблема: модуль не загружается, хотя строка в php.ini присутствует. Решение: проверьте путь extension_dir:
php -r "echo PHP_EXTENSION_DIR;"
Убедитесь, что файл .so находится именно в этой директории. Если нет - укажите полный путь:
extension=/usr/local/lib/php/extensions/no-debug-non-zts-20210902/mbstring.so
Ошибка: конфликт с imunify360 или другими модулями безопасности - они могут блокировать загрузку некоторых расширений.
Как управлять модулями через утилиты Debian/Ubuntu (phpenmod, phpdismod)?
В дистрибутивах на основе Debian модули PHP организованы через директории mods-available и символьные ссылки. Утилиты phpenmod и phpdismod упрощают включение/отключение.
sudo phpenmod -v 8.2 mbstring
sudo phpdismod -v 8.2 xdebug
Эти команды создают/удаляют символьную ссылку в /etc/php/8.2/mods-available/ для нужных контекстов (cli, fpm, apache2). После изменений перезапускать сервер не обязательно, но для надёжности лучше.
Цель: удобное централизованное управление модулями PHP для всех SAPI. Когда используется: на Debian/Ubuntu серверах для стандартных пакетных модулей.
Проблема: команда phpenmod не найдена. Решение: установите пакет php-common:
sudo apt install php-common
Ошибка: модуль не включён для нужного SAPI (например, для FPM, но не для CLI). Проверьте, что указана версия и контекст:
phpenmod -v 8.2 -s fpm mbstring
Расширенные примеры администрирования PHP-модулей
Ниже приведены более детальные иллюстрации работы с модулями, включая нестандартные сценарии.
Пример 1: Скрипт для полной диагностики установленных модулей
<?
// diagnostic.php
$all_extensions = get_loaded_extensions();
sort($all_extensions);
echo "<h3>Все загруженные модули (" . count($all_extensions) . "):</h3>";
echo "<pre>" . implode("\n", $all_extensions) . "</pre>";
$required = ['PDO', 'pdo_mysql', 'mbstring', 'json', 'xml', 'gd'];
$missing = array_diff($required, $all_extensions);
if ($missing) {
echo "<p style='color:red'>Не найдены модули: " . implode(', ', $missing) . "</p>";
} else {
echo "<p style='color:green'>Все необходимые модули присутствуют.</p>";
}
?>
Результат выполнения (упрощённо): Все загруженные модули (67): ... PDO pdo_mysql pdo_sqlite ... Все необходимые модули присутствуют.
Этот скрипт полезен при проверке окружения перед развёртыванием приложения, например в CI/CD.
Пример 2: Установка и компиляция расширения igbinary из исходников PECL с нестандартными опциями
# Скачиваем исходный код напрямую
wget https://pecl.php.net/get/igbinary-3.2.15.tgz
tar xzf igbinary-3.2.15.tgz
cd igbinary-3.2.15
# Генерируем configure с помощью phpize
phpize
./configure --enable-igbinary --with-php-config=/usr/bin/php-config8.2
make -j4
sudo make install
# Добавляем в php.ini (можно также через phpenmod)
echo "extension=igbinary.so" | sudo tee -a /etc/php/8.2/cli/conf.d/30-igbinary.ini
Вывод php -m | grep igbinary: igbinary
Пояснение: ручная компиляция позволяет задать дополнительные флаги (например, --enable-igbinary). Используйте, когда PECL не справляется с зависимостями или требуется патч.
Пример 3: Настройка только для FPM через отдельный php.ini и перезапуск без даунтайма
# Редактируем конфиг FPM
sudo nano /etc/php/8.2/fpm/php.ini
# Добавляем: extension = some_custom_extension.so
# Перечитываем конфигурацию FPM без остановки
sudo systemctl reload php8.2-fpm
# Проверяем, что модуль загружен только у FPM
php -i | grep some_custom_extension # пусто
curl http://localhost/info.php | grep some_custom_extension # видно
Пример info.php: <?php phpinfo(); ?> В разделе "some_custom_extension" должно отображаться активное состояние.
Проблема: модуль не отображается в phpinfo() для FPM. Решение: проверьте, что файл ini для FPM действительно загружается - наличие строки Additional .ini files parsed в phpinfo.
Пример 4: Использование модуля opcache с тонкой настройкой через INI
; /etc/php/8.2/cli/conf.d/10-opcache.ini
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.revalidate_freq=0
opcache.fast_shutdown=1
Проверка через phpinfo() показывает раздел "Zend OPcache" с указанными параметрами.
Применение: для высоконагруженных проектов. Обратите внимание: revalidate_freq=0 означает, что проверка изменений выполняется при каждом запросе (только для разработки). На продакшене ставят значение 2-5.
Пример 5: Отключение проблемного модуля через директиву disable_functions без удаления
; /etc/php/8.2/fpm/php.ini
disable_functions = "exec, system, shell_exec, proc_open, show_source"
Это не отключает модуль полностью, но блокирует вызов определённых функций. Удобно, когда модуль нужен, но некоторые его функции должны быть запрещены.
После перезагрузки FPM вызов system() из PHP выдаст ошибку.