Конфигурация PHP расширений: параметры extension_dir и extension
Подходы к конфигурации расширений 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.
Продвинутые сценарии конфигурации
Пример 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. Если есть одинаковые директивы, приоритет у последней загруженной.