Управление расширениями PHP: как отключить ненужные модули
Способы отключения расширений PHP
Как отключить расширение PHP через основной конфигурационный файл?
Наиболее надёжный и рекомендуемый метод - редактирование файла php.ini. Этот подход подходит для всех окружений, где PHP работает через модуль веб-сервера или как CGI/FPM.
Шаги:
- Определить расположение php.ini с помощью команды
php --iniили функцииphpinfo(). - Открыть файл в текстовом редакторе.
- Найти строку вида
extension=имя_расширения.so(Linux) илиextension=php_имя.dll(Windows). - Закомментировать строку, поставив в начале точку с запятой (
;). - Сохранить изменения и перезапустить веб-сервер (Apache, Nginx) или PHP-FPM.
; Пример закомментированной строки в php.ini
; extension=mysqli
; extension=gdDocker php ext (расширение php в docker)
Результат: расширение перестаёт загружаться при следующем запуске PHP. Проверить можно через phpinfo() - модуль исчезнет из списка.
Ext http php (расширение http для php)
Типичные ошибки:
- Файл php.ini не найден - возможно, используется несколько версий PHP, и изменяется не тот файл. Следует проверить вывод
php --ini. - После правки расширение всё ещё активно - не перезапущен веб-сервер или PHP-FPM. Для Apache:
sudo systemctl reload apache2илиsudo service httpd restart. - Синтаксическая ошибка в php.ini (например, лишний пробел) - PHP может отказаться запускаться. Проверить синтаксис:
php --ini | grep -i error.
Как отключить расширение PHP без доступа к php.ini, используя файл .htaccess?
Если используется Apache и PHP работает как модуль, можно применить директиву php_value или php_admin_value в .htaccess. Этот метод действует только на текущий каталог и подходит для хостингов без прав на php.ini.
# Отключение расширения в .htaccess
php_value extension mysqli
php_value extension gdOff php ext (отключение расширения php)
Установка пустого значения может трактоваться как отключение, но надёжнее использовать php_admin_value, если доступно.
Проблемы: Не все расширения можно отключить через .htaccess - некоторые защищены на уровне php.ini (настройка PHP_INI_SYSTEM). Кроме того, на сервере может быть запрещено использование php_value (директива AllowOverride).
Как отключить расширение временно при запуске скрипта из командной строки?
Для одноразовых задач или тестирования можно запустить PHP с опцией -d, указав пустое значение для расширения:
php -d "extension=gd" script.php
php -d "extension=mysqli" -d "extension=pdo_mysql" script.phpExt php install (установка расширения php)
Такой способ не изменяет глобальную конфигурацию и действует только на один вызов.
Ошибка: Если расширение всё равно загружается, возможно, оно уже скомпилировано статически или загружается через директиву zend_extension. В этом случае -d не сработает.
Как отключить расширение с помощью функции dl() (устаревший способ)?
Функция dl() позволяет загрузить расширение во время выполнения, но отключить уже загруженное ею же - невозможно. Поэтому данный вариант подходит только для отказа от загрузки нового расширения, но не для деактивации уже активного. Пример:
if (!extension_loaded('gd')) {
dl('gd.so'); // Загружает, но не отключает
}
Для отключения лучше использовать другие методы.
Проблемы: dl() считается устаревшей, небезопасной и отключена в большинстве современных сборок PHP (начиная с PHP 7). Не рекомендуется к использованию.
Как отключить расширение через конфигурацию PHP-FPM (pool.d)?
Если PHP работает через PHP-FPM, можно переопределить настройки для конкретного пула, добавив директиву php_admin_value[extension] в файл пула (например, www.conf):
php_admin_value[extension] = nothing
Или закомментировать загрузку в общем php.ini, как в основном методе.
Особенность: Переопределение через пул перезаписывает глобальные настройки, но не отключает расширение, если оно загружается в самом php.ini до чтения пула. Рекомендуется править именно основной php.ini.
Расширенные примеры отключения расширений PHP с пошаговым кодом и результатами.
Пример 1. Отключение расширения xmlrpc в Linux через php.ini
# Определение файла php.ini
php --ini | head -1
# Вывод: Configuration File (php.ini) Path: /etc/php/8.2/cli/php.ini
# Редактирование (требуются права root)
sudo nano /etc/php/8.2/cli/php.ini
# Поиск строки extension=xmlrpc
# замена на ;extension=xmlrpc
# Сохранение и выход.
# Перезапуск PHP-FPM
sudo systemctl restart php8.2-fpm
# Проверка
php -m | grep xmlrpc
# Ожидаемый вывод: пустая строка (модуль не загружен)
Пример 2. Отключение расширения через .htaccess для конкретного каталога (Apache)
# Файл /var/www/html/app/.htaccess
php_value extension gd
php_value extension json
# Если необходимо отключить только для определённого CGI-скрипта,
# можно использовать директиву :
php_value extension mysqli
Результат: при доступе к upload.php и другим скриптам в каталоге app расширение gd и json не будут доступны. Проверка через phpinfo() покажет их отсутствие.
Пример 3. Отключение расширения на лету через командную строку с проверкой
# Исходное состояние (расширение xdebug активно)
php -m | grep xdebug
# Вывод: xdebug
# Запуск скрипта без xdebug
php -d "zend_extension=xdebug.so" script.php # не сработает, так как механизм другой
# Правильный способ отключить Zend-расширение через -d не поддерживается,
# но для обычных расширений:
php -d "extension=imap" test.php
# внутри test.php:
# <?php echo extension_loaded('imap') ? 'загружено' : 'не загружено'; ?>
# Вывод: не загружено
Пример 4. Отключение всех необязательных расширений через скрипт на Bash (для тестового окружения)
#!/bin/bash
# Отключаем расширения, кроме базовых (Core, date, json)
PHP_INI=$(php --ini | grep "Loaded Configuration File" | awk '{print $4}')
if [ -z "$PHP_INI" ]; then
echo "php.ini не найден"
exit 1
fi
# Заменяем все строки extension= на закомментированные
sed -i 's/^extension=.*/;&/' "$PHP_INI"
# Или выборочно:
sed -i 's/^extension=mysqli/;&/' "$PHP_INI"
sed -i 's/^extension=gd/;&/' "$PHP_INI"
echo "Расширения отключены в $PHP_INI"
# После перезапуска сервера
Результат: все указанные расширения перестают загружаться. Скрипт полезен для быстрой настройки окружения с минимальным набором модулей.
Пример 5. Отключение расширения в Windows через php.ini
# Путь к php.ini часто C:\php\php.ini
# Найти строку extension=php_curl.dll
# Изменить на ;extension=php_curl.dll
# Сохранить, перезапустить веб-сервер (IIS, Apache) через диспетчер служб.
# Проверка:
php -m | findstr /I curl
# если ничего не выведено - отключено.