Решение проблемы загрузки модулей PHP в Apache
В конфигурационном файле php.ini активирован ряд модулей, однако некоторые из них не загружаются при работе через веб-сервер Apache, хотя корректно работают в командной строке (CLI).
Конфигурация модулей в php.ini
В файле настроек присутствуют следующие директивы для подключения расширений:
extension=c:\Apache24\php8\ext\php_bz2.dll- активен.extension=curl- попытка загрузки без полного пути (предыдущая строка с полным путём закомментирована, так как не работает).extension=ftp- аналогичная ситуация с модулем FTP.extension=c:\Apache24\php8\ext\php_fileinfo.dll- активен.extension=c:\Apache24\php8\ext\php_gd.dll- активен.extension=c:\Apache24\php8\ext\php_gettext.dll- активен.extension=c:\Apache24\php8\ext\php_mbstring.dll- активен.extension=openssl- попытка загрузки без полного пути (полный путь закомментирован).extension=c:\Apache24\php8\ext\php_pdo_mysql.dll- активен.
Суть проблемы
Модули cURL, FTP и OpenSSL не загружаются в среде веб-сервера Apache. Функция phpinfo(), запущенная через браузер, не отображает эти расширения. При этом выполнение команды php -i в командной строке показывает, что все модули загружены корректно.
Анализ логов Apache
В журналах сервера присутствуют предупреждения о невозможности загрузки динамических библиотек. Ошибки имеют следующий вид (на примере cURL):
PHP Warning: PHP Startup: Unable to load dynamic library 'C:\Apache24\php8\ext\php_curl.dll' (tried: C:\Apache24\php8\ext\php_curl.dll (Не найден указанный модуль), C:\Apache24\php\ext\\php_C:\Apache24\php8\ext\php_curl.dll.dll (Не найден указанный модуль)) in Unknown on line 0
Аналогичные ошибки возникают для php_ftp.dll и php_openssl.dll. Ключевые моменты:
- PHP пытается найти файл по указанному полному пути, но сообщает, что модуль не найден.
- Вторая попытка поиска содержит некорректно сформированный путь с дублированием, что указывает на возможную проблему в конфигурационных директивах.
Диагностика и рекомендуемые шаги
Поскольку стандартные рекомендации (проверка путей, прав доступа, перезагрузка Apache) не принесли результата, предлагается следующий план действий:
- Проверка использования разных файлов php.ini. Убедитесь, что Apache использует тот же файл
php.ini, что и CLI. Для этого создайте скрипт с<?php phpinfo(); ?>и найдите параметр Loaded Configuration File. Сравните путь с тем, что возвращает командаphp --iniв терминале. - Проверка переменной окружения extension_dir. В том же выводе
phpinfo()найдите значение extension_dir. Убедитесь, что оно корректно указывает на папкуc:\Apache24\php8\ext\. При несовпадении исправьте директивуextension_dirвphp.ini, используемом Apache. - Проверка зависимостей (DLL-файлов). Модули cURL, FTP и OpenSSL могут иметь внешние зависимости от библиотек (например,
libeay32.dll,ssleay32.dll). Убедитесь, что эти файлы находятся в системном пути (например, в каталогеc:\Apache24\php8\) или в папке, указанной в переменной окруженияPATHсистемы. - Совместимость версий PHP и Apache. Убедитесь, что используется правильная разрядность (x86/x64): все компоненты (PHP, Apache, модули) должны быть собраны для одной архитектуры.
- Прямое указание путей в php.ini. Попробуйте раскомментировать строки с полными путями, но исправить их на корректный формат (например,
extension=c:/Apache24/php8/ext/php_curl.dllилиextension=c:\Apache24\php8\ext\php_curl.dll). Удалите или закомментируйте строки видаextension=curl. - Анализ прав доступа. Убедитесь, что учётная запись, от имени которой запущена служба Apache (например,
SYSTEMили специальный пользователь), имеет права на чтение и выполнение DLL-файлов в каталогеc:\Apache24\php8\ext\. - Переустановка модулей. Попробуйте заменить проблемные DLL-файлы их оригинальными копиями из официального дистрибутива PHP, совместимого с вашей версией.
Наиболее вероятными причинами являются использование разными средами разных файлов php.ini или отсутствие необходимых для модулей системных библиотек в пути, доступном для Apache.