Список и управление модулями PHP

Раздел: Администрирование 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 выдаст ошибку.

Необходимые модули PHP - comments

En
необходимые модули php (php)