Управление расширениями PHP: как отключить ненужные модули

Раздел: Расширения PHP -> Управление расширениями PHP

Способы отключения расширений PHP

Как отключить расширение PHP через основной конфигурационный файл?

Наиболее надёжный и рекомендуемый метод - редактирование файла php.ini. Этот подход подходит для всех окружений, где PHP работает через модуль веб-сервера или как CGI/FPM.

Шаги:

  1. Определить расположение php.ini с помощью команды php --ini или функции phpinfo().
  2. Открыть файл в текстовом редакторе.
  3. Найти строку вида extension=имя_расширения.so (Linux) или extension=php_имя.dll (Windows).
  4. Закомментировать строку, поставив в начале точку с запятой (;).
  5. Сохранить изменения и перезапустить веб-сервер (Apache, Nginx) или PHP-FPM.
; Пример закомментированной строки в php.ini
; extension=mysqli
; extension=gd

Docker 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 gd

Off 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.php

Ext 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
# если ничего не выведено - отключено.

Отключение расширения PHP - comments

En
Off php ext (php)