Решение проблемы загрузки модулей 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) не принесли результата, предлагается следующий план действий:

  1. Проверка использования разных файлов php.ini. Убедитесь, что Apache использует тот же файл php.ini, что и CLI. Для этого создайте скрипт с <?php phpinfo(); ?> и найдите параметр Loaded Configuration File. Сравните путь с тем, что возвращает команда php --ini в терминале.
  2. Проверка переменной окружения extension_dir. В том же выводе phpinfo() найдите значение extension_dir. Убедитесь, что оно корректно указывает на папку c:\Apache24\php8\ext\. При несовпадении исправьте директиву extension_dir в php.ini, используемом Apache.
  3. Проверка зависимостей (DLL-файлов). Модули cURL, FTP и OpenSSL могут иметь внешние зависимости от библиотек (например, libeay32.dll, ssleay32.dll). Убедитесь, что эти файлы находятся в системном пути (например, в каталоге c:\Apache24\php8\) или в папке, указанной в переменной окружения PATH системы.
  4. Совместимость версий PHP и Apache. Убедитесь, что используется правильная разрядность (x86/x64): все компоненты (PHP, Apache, модули) должны быть собраны для одной архитектуры.
  5. Прямое указание путей в php.ini. Попробуйте раскомментировать строки с полными путями, но исправить их на корректный формат (например, extension=c:/Apache24/php8/ext/php_curl.dll или extension=c:\Apache24\php8\ext\php_curl.dll). Удалите или закомментируйте строки вида extension=curl.
  6. Анализ прав доступа. Убедитесь, что учётная запись, от имени которой запущена служба Apache (например, SYSTEM или специальный пользователь), имеет права на чтение и выполнение DLL-файлов в каталоге c:\Apache24\php8\ext\.
  7. Переустановка модулей. Попробуйте заменить проблемные DLL-файлы их оригинальными копиями из официального дистрибутива PHP, совместимого с вашей версией.

Наиболее вероятными причинами являются использование разными средами разных файлов php.ini или отсутствие необходимых для модулей системных библиотек в пути, доступном для Apache.