Конфигурация PHP расширений: параметры extension_dir и extension

Раздел: Администрирование PHP -> Настройка PHP

Подходы к конфигурации расширений PHP

Как задать каталог расширений и включить одно из них?

Наиболее распространённый способ - указать директиву extension_dir в файле php.ini для определения каталога, где PHP ищет файлы расширений, и затем включать нужные модули через extension. Обычно extension_dir задаётся абсолютным или относительным путём, а extension указывает имя файла (например, curl.so для Linux или php_curl.dll для Windows).


; Устанавливаем каталог расширений
extension_dir = "/usr/lib/php/20190902"

; Включаем несколько расширений
extension=curl
extension=mbstring
extension=pdo_mysql

Php выделить память (выделение памяти php)

После изменения php.ini необходимо перезапустить веб-сервер или PHP-FPM. Проверить включённые расширения можно через phpinfo() или командой php -m.

Проблема: расширение не загружается, хотя указано в ini. Решение: необходимо убедиться, что файл расширения существует в extension_dir, и что версия расширения совместима с текущей версией PHP (например, компилировано под ту же API версию). Также проверить наличие ошибок в логах PHP.

Как указать относительный путь к расширениям?

Вместо абсолютного пути можно использовать extension_dir = "ext" - относительный путь от корня установки PHP. Это удобно при переносе проекта на другой сервер, если структура каталогов сохранена.


; Относительный путь (относительно корня PHP)
extension_dir = "ext"

Php ini timezone (настройка часового пояса в php (date.timezone))

Затруднение: если относительный путь неверен, PHP не найдёт расширения. Рекомендуется проверять через php -i | grep extension_dir.

Как загрузить Zend-расширения?

Для расширений, использующих Zend-механизм (например, Xdebug, OpCache), применяется директива zend_extension. Путь указывается такой же, как для обычных расширений.


zend_extension = "/usr/lib/php/20190902/xdebug.so"

Xampp php ini (настройка php.ini в xampp)

Xdebug может конфликтовать с OpCache, если загружен в неправильном порядке. Рекомендуется zend_extension указывать после extension.

Как включить расширение только для определённого SAPI?

PHP.ini поддерживает секционные блоки, например [CLI], [APACHE], [PHP-FPM]. Расширения, указанные внутри такого блока, применяются только для соответствующего SAPI.


[CLI]
extension = xdebug.so   ; только для командной строки

[APACHE]
extension = opcache.so

Php ini sessions (настройка сессий в php (session.*))

Если расширение требуется для всех SAPI, его следует разместить вне блоков.

Как загрузить расширение из другого каталога, не меняя extension_dir?

Можно указать полный путь к файлу в директиве extension. Это полезно, если расширения находятся в разных каталогах.


extension = "/custom/path/to/extension/curl.so"

Php ini extension (настройка расширений php (extension_dir, extension))

При таком подходе PHP всё равно использует extension_dir для поиска, если путь относительный. Абсолютный путь не зависит от extension_dir.

Как использовать несколько ini-файлов для организации расширений?

Часто в дистрибутивах Linux используется сканирование дополнительных ini-файлов из каталога (например, /etc/php.d/). Это задаётся переменной окружения PHP_INI_SCAN_DIR или параметром --with-config-file-scan-dir при сборке. Каждый файл может содержать директивы для отдельных расширений.


; Файл создаётся с содержимым /etc/php.d/20-curl.ini
extension=curl.so

; Затем проверяется, что каталог сканируется
php -i | grep "Scan this dir"

ограничение памяти php (ограничение памяти php)

Если файлы загружаются в неверном порядке, могут возникнуть конфликты. Имя файла обычно нумеруют для управления порядком.

Как загрузить расширение динамически через скрипт (устаревший метод)?

Функция dl() позволяет загрузить расширение на лету, но она отключена в большинстве современных конфигураций. Требует, чтобы extension_dir был установлен в php.ini, и расширение находилось там.


// Включение расширения динамически
if (!extension_loaded('myext')) {
    dl('myext.so') or die('Не удалось загрузить расширение');
}

dl() считается устаревшей и небезопасной. Рекомендуется статически включать расширения через php.ini.

- Php ini memory (настройка memory_limit в php)
- Php post size (размер post данных в php)
- битрикс restore php (восстановление php в битрикс)

Продвинутые сценарии конфигурации

Пример 1: Использование .user.ini для задания extension_dir

При отсутствии доступа к основному php.ini можно попробовать изменить extension_dir через ini_set в начале скрипта. Демонстрация ограниченной применимости:

Пример

// Попытка установить extension_dir через ini_set (не сработает для статических расширений)
ini_set('extension_dir', '/custom/path');
// Попытка загрузить расширение через dl()
if (!extension_loaded('myext')) {
    dl('myext.so');  // может работать, если extension_dir изменён
}
// Результат: dl() может выдать Warning: dl(): Unable to load dynamic library

Цель: показать ограничения .user.ini и рискованные методы.

Пример 2: Определение API версии расширения

Чтобы избежать ошибки "PHP Startup: Unable to load dynamic library ... wrong ELF class", необходимо знать номер PHP API версии. Узнать его можно через php -i | grep PHP_API или php -r "echo PHP_API_VERSION;". Расширение должно быть скомпилировано под ту же API версию.

Пример

$ php -r 'echo PHP_API_VERSION;'
// Вывод: 20190902

Проверка расширения:

Пример

$ php -i | grep "PHP Extension =>" 
// Для загруженного расширения можно проверить:
$ php -r 'phpinfo();' | grep "PHP Extension Version"

Если версия не совпадает, необходимо перекомпилировать расширение с соответствующей версией PHP.

Пример 3: Компиляция расширения с указанием extension_dir

При сборке PECL-расширения можно переопределить путь с помощью параметра --with-php-config и впоследствии переместить .so файл в нужный extension_dir. Пример для сборки xdebug:

Пример

$ pecl install xdebug
# После сборки файл xdebug.so попадёт в каталог, указанный в php-config
# Узнать его:
$ php-config --extension-dir
# Вывод: /usr/lib/php/20190902

Если требуется поместить расширение в другой каталог, можно скопировать файл и указать абсолютный путь в php.ini.

Пример

$ cp /usr/lib/php/20190902/xdebug.so /custom/ext/
# В php.ini:
extension = /custom/ext/xdebug.so

Пример 4: Загрузка расширения с использованием переменной окружения PHP_EXTENSION_DIR

PHP можно запустить с установленной переменной окружения, которая переопределяет extension_dir, если он не задан в php.ini. Пример:

Пример

$ PHP_EXTENSION_DIR=/my/ext/path php -m

Переменная влияет только на текущий процесс. Это может быть полезно в изолированных сценариях тестирования.

# Вывод: список расширений, загруженных из /my/ext/path (если они там есть)

Пример 5: Настройка расширения OpCache с параметрами

После включения расширения opcache.so часто добавляют параметры конфигурации. Всё помещается в одном файле:

Пример

; Включаем OpCache
extension=opcache.so

; Параметры настройки
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000

Эти директивы применяются после загрузки расширения. Проверить через php -i | grep opcache.

Пример 6: Использование нескольких дополнительных ini-каталогов с приоритетами

Установка PHP_INI_SCAN_DIR позволяет указать несколько каталогов, разделённых двоеточием (Unix) или точкой с запятой (Windows). Файлы загружаются в алфавитном порядке. Это помогает разграничить конфигурации.

Пример

$ PHP_INI_SCAN_DIR=/etc/php.d:/opt/myext/ini php -i

Файлы из /opt/myext/ini загружаются после файлов из /etc/php.d. Если есть одинаковые директивы, приоритет у последней загруженной.

Настройка расширений PHP (extension_dir, extension) - comments

En
Php ini extension (php)