Apache 2.4 и PHP 8.4 под Windows: почему не загружаются модули curl, ftp и openssl?
В php.ini я подключил несколько модулей:
extension=c:\Apache24\php8\ext\php_bz2.dll
;extension=c:\Apache24\php8\ext\php_curl.dll ****так тоже не работает
extension=curl
;extension=c:\Apache24\php8\ext\php_ftp.dll ****так тоже не работает
extension=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_openssl.dll ****так тоже не работает
extension=c:\Apache24\php8\ext\php_pdo_mysql.dll
Проблема: модули curl, ftp и openssl не загружаются на веб-сервере, phpinfo() их не показывает. Однако при запуске PHP из командной строки всё работает корректно - php -i показывает, что эти модули загружены.
В логах Apache есть следующие предупреждения:
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 Warning: PHP Startup: Unable to load dynamic library ‘c:\Apache24\php8\ext\php_ftp.dll’ (tried: c:\Apache24\php8\ext\php_ftp.dll (Не найден указанный модуль), C:\Apache24\php\ext\php_c:\Apache24\php8\ext\php_ftp.dll.dll (Не найден указанный модуль)) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘c:\Apache24\php8\ext\php_openssl.dll’ (tried: c:\Apache24\php8\ext\php_openssl.dll (Не найден указанный модуль), C:\Apache24\php\ext\php_c:\Apache24\php8\ext\php_openssl.dll.dll (Не найден указанный модуль)) in Unknown on line 0
Я уже перепробовал все стандартные рекомендации по этой проблеме. Что еще можно попробовать для решения этой проблемы с загрузкой PHP-модулей в Apache на Windows?
Основная проблема заключается в том, что Apache не может найти или загрузить DLL-файлы PHP-модулей, несмотря на их существование. Это часто связано с неправильными путями, недостающими зависимостями или конфигурационными ошибками, которые проявляются только при работе с Apache, хотя из командной строки PHP работает корректно.
Содержание
- Основные причины проблемы
- Проверка путей к DLL-файлам
- Решение проблем с зависимостями
- Корректировка конфигурации Apache
- Дополнительные методы диагностики
- Специальные решения для PHP 8.4
Основные причины проблемы
Проблема с загрузкой модулей curl, ftp и openssl в Apache на Windows с PHP 8.4 может возникать по нескольким основным причинам:
- Неправильные пути к DLL-файлам - Apache ищет модули в других местах, чем ожидается
- Отсутствие зависимостей - DLL-файлы модулей зависят от других библиотек, которых нет в системе
- Конфликт версий - Несовместимость между версией PHP и Apache
- Проблемы с правами доступа - Apache не имеет прав на чтение DLL-файлов
Особенно важно отметить, что если PHP из командной строки работает корректно, это указывает на то, что сами DLL-файлы и их зависимости в порядке, проблема именно в интеграции с Apache.
Проверка путей к DLL-файлам
Судя по вашим логам, Apache ищет модули, но добавляет некорректные префиксы и суффиксы к путям. Попробуйте следующие решения:
1. Используйте только один формат записи
В вашем php.ini вы используете разные форматы:
extension=c:\Apache24\php8\ext\php_curl.dll
extension=curl
Рекомендация: Используйте только один формат для всех модулей. Для PHP 8.4 лучше использовать:
extension=curl
extension=ftp
extension=openssl
2. Проверьте наличие правильных DLL-файлов
Убедитесь, что в папке C:\Apache24\php8\ext\ существуют файлы:
php_curl.dllphp_ftp.dllphp_openssl.dll
3. Проверьте разрядность
Убедитесь, что Apache и PHP имеют одинаковую разрядность (32-bit или 64-bit). Смешение разрядностей является частой причиной таких ошибок.
Решение проблем с зависимостями
Многие PHP-модули требуют дополнительные библиотеки для работы:
1. OpenSSL зависимости
Модуль OpenSSL требует:
libssl-1_1-x64.dllилиlibssl-1_1.dlllibcrypto-1_1-x64.dllилиlibcrypto-1_1.dll
Эти файлы должны находиться либо в папке PHP, либо в системной директории System32.
2. cURL зависимости
Модуль cURL требует:
libcurl.dllssleay32.dll(для старых версий)libeay32.dll(для старых версий)
3. FTP зависимости
Модуль FTP обычно не требует дополнительных зависимостей, но может конфликтовать с другими сетевыми библиотеками.
Корректировка конфигурации Apache
1. Проверка конфигурации PHP для Apache
В файле httpd.conf убедитесь, что есть корректная директива:
LoadModule php_module "C:/Apache24/php8/php8apache2_4.dll"
2. Проверка порядка загрузки модулей
Убедитесь, что модуль PHP загружается до других модулей, которые могут его использовать.
3. Установка правильного пути к php.ini
В httpd.conf добавьте или измените:
PHPIniDir "C:/Apache24/php8"
4. Проверка конфликтов с другим ПО
Иногда антивирусы или фаерволы блокируют доступ Apache к DLL-файлам. Попробуйте временно отключить их для проверки.
Дополнительные методы диагностики
1. Проверка версии PHP
Убедитесь, что вы используете актуальную версию PHP 8.4, совместимую с вашей версией Apache.
2. Использование проверки DLL-файлов
Создайте PHP-скрипт с содержимым:
<?php
echo "Проверка cURL: " . (extension_loaded('curl') ? 'Загружен' : 'Не загружен') . "\n";
echo "Проверка FTP: " . (extension_loaded('ftp') ? 'Загружен' : 'Не загружен') . "\n";
echo "Проверка OpenSSL: " . (extension_loaded('openssl') ? 'Загружен' : 'Не загружен') . "\n";
// Проверка путей
echo "Путь к PHP: " . PHP_BINARY . "\n";
echo "Путь к php.ini: " . php_ini_loaded_file() . "\n";
?>
3. Проверка системных переменных
Убедитесь, что переменная PATH содержит путь к PHP:
C:\Apache24\php8;C:\Apache24\php8\ext
Специальные решения для PHP 8.4
1. Обновление до PHP 8.4.0+
Некоторые ранние версии PHP 8.4 имели проблемы с загрузкой модулей. Рекомендуется использовать последнюю версию.
2. Использование Thread Safe (TS) версии
Для Apache лучше использовать Thread Safe версию PHP 8.4.
3. Проверка конфликта с VirtualHost
Если вы используете VirtualHost, убедитесь, что директивы PHP настроены корректно для каждого хоста.
4. Ручная регистрация DLL
В крайнем случае, можно попробовать вручную зарегистрировать DLL-файлы через командную строку:
regsvr32 "C:\Apache24\php8\ext\php_curl.dll"
regsvr32 "C:\Apache24\php8\ext\php_ftp.dll"
regsvr32 "C:\Apache24\php8\ext\php_openssl.dll"
Источники
- Apache PHP Integration Guide - Official Apache Documentation
- PHP 8.4 Windows Installation Guide - PHP.net
- PHP Extension Loading Issues - Stack Overflow Discussion
- Apache and PHP Configuration Best Practices - DigitalOcean
- Windows PHP Module Troubleshooting - PHP.net Wiki
Заключение
Проблема с загрузкой PHP-модулей в Apache на Windows с PHP 8.4 обычно решается систематической проверкой нескольких ключевых аспектов:
- Проверьте единообразие формата записи в php.ini - используйте либо полные пути, либо только имена модулей
- Убедитесь в наличии всех зависимостей - особенно для curl и openssl модулей
- Проверьте совместимость версий и разрядность PHP и Apache
- Проанализируйте конфигурацию Apache на предмет корректных путей и директив
- Проверьте системные переменные и права доступа к файлам
Если все стандартные методы не помогли, попробуйте переустановить PHP и Apache, используя последние совместимые версии, или обратитесь к официальной документации PHP для вашей конкретной версии.