Вопрос или проблема
Не уверен, подходит ли это для Stack Overflow или здесь.
У меня есть сервер Apache 2.4, работающий на ОС Windows Server 2019. Я установил PHP 8.1.29 с сайта Apache для Windows, и все остальные функции PHP, похоже, работают нормально.
Я не могу заставить работать cURL. Если я пытаюсь использовать какие-либо функции cURL в PHP, я получаю сообщения, которые предполагают, что функция не существует, что подразумевает, что cURL не загружен. Если я делаю тест phpinfo, чтобы открыть веб-страницу с информацией о PHP, я вижу, что у нее нет заголовка cURL, так что я знаю, что он не загружается.
Если я открою файл php.ini в C:\php\php.ini, я вижу, что расширение php_curl здесь указано и не закомментировано. Я вижу на странице PHPinfo, что это правильный файл php.ini, который используется Apache.
Если я загляну в журналы ошибок, я вижу следующую строчку, которая представляет интерес:
PHP Warning: PHP Startup: Не удалось загрузить динамическую библиотеку 'C:\\php\\ext\\php_curl' (попытка: C:\\php\\ext\\php_curl (Указанная процедура не найдена), ext\\php_C:\\php\\ext\\php_curl.dll (Указанный модуль не найден)) в Неизвестно на строке 0
Указанный файл dll присутствует в C:\php\ext\
Раздел расширений файла php.ini выглядит следующим образом:
; Директория, в которой находятся загружаемые расширения (модули).
; https://php.net/extension-dir
;extension_dir = "./"
; На Windows:
extension_dir = "ext"
Что, я считаю, правильно.
Я пытался установить расширение curl с помощью следующей строки в файле php.ini:
extension=C:\php\ext\php_curl
Я пытался установить его следующим образом:
extension=curl
и перезапускал сервер после каждого изменения, но оно все равно не загружает его с той же ошибкой:
PHP Warning: PHP Startup: Не удалось загрузить динамическую библиотеку 'curl' (попытка: ext\\curl (Указанный модуль не найден), ext\\php_curl.dll (Указанная процедура не найдена)) в Неизвестно на строке 0
Я пробовал скачать PHP 8.2 и взять файл dll curl и поместить его в то же место, на случай, если файл из 8.1.29 поврежден, но это тоже не сработало.
Я нашел эту тему на Stack Overflow:
https://stackoverflow.com/questions/12348/php-curl-on-windows-install-the-specified-module-could-not-be-found
И на основе этого я скопировал 3 файла libssl-* и 3 файла libcrypto-* из папки php в папку system32 и снова перезапустил apache, но все еще получаю ту же ошибку:
PHP Warning: PHP Startup: Не удалось загрузить динамическую библиотеку 'curl' (попытка: ext\\curl (Указанный модуль не найден), ext\\php_curl.dll (Указанная процедура не найдена)) в Неизвестно на строке 0
Все это началось после того, как я обновил PHP с более ранней версии 8.1 для исправления опубликованного уязвимости безопасности, до этого оно работало нормально.
Правка для добавления: У меня уже была папка установки php в переменной окружения PATH, так что перемещение этих файлов не должно было быть необходимо.
Я только что обновил Apache с версии 2.4.58 до 2.4.62 (Windows), и теперь у меня возникла эта проблема. В Apache/bin есть
openssl.exe
libcrypto-3-x64.dll
libssl-3-x64.dll
и
apache\bin> openssl version
OpenSSL 3.1.7 3 Sep 2024 (Library: OpenSSL 3.1.7 3 Sep 2024)
Ответ или решение
Чтобы решить проблему с загрузкой модуля cURL в PHP на вашем сервере Windows с Apache, вам следует выполнить несколько шагов, чтобы убедиться, что cURL правильно настроен. Давайте разберёмся по порядку.
Проверка наличия необходимых файлов
-
Проверьте наличие библиотек: Убедитесь, что в директории
C:\php\ext\
действительно есть файлыphp_curl.dll
, а такжеlibssl-3-x64.dll
,libcrypto-3-x64.dll
. Эти библиотеки необходимы для работы cURL. -
Совместимость версий: Убедитесь, что версия
php_curl.dll
, которую вы используете, совместима с вашей версией PHP и Apache. Например, если вы используете PHP 8.1.29, то убедитесь, что вы не скопировали библиотеки из более новой версии PHP. Это может вызвать конфликты.
Настройки php.ini
- Настройте php.ini:
- Откройте файл конфигурации
php.ini
, который загружается вашим Apache (вы можете это подтвердить через PHPinfo). - Убедитесь, что строка
extension_dir
выглядит так:extension_dir = "C:\php\ext"
- Убедитесь, что строка для загрузки cURL не закомментирована:
extension=php_curl.dll
- Откройте файл конфигурации
Обновление зависимостей OpenSSL
-
Проверьте OpenSSL: Для работы cURL требуются файлы OpenSSL. Поскольку вы обновили Apache, обратите внимание на наличие следующих файлов в каталоге
apache\bin
:libcrypto-3-x64.dll
libssl-3-x64.dll
Поскольку вы упомянули, что у вас установлена версия OpenSSL 3.1.7, убедитесь, что совместимость между версиями OpenSSL и PHP соблюдена. В некоторых случаях может помочь копирование библиотек из папки PHP в папку
apache\bin
.
Правка системных переменных
- Проверьте PATH: Убедитесь, что путь к папке PHP включен в переменную окружения PATH. Это позволит системе найти необходимые динамические библиотеки.
Перезапуск Apache
- Перезапустите Apache: После внесения всех изменений обязательно перезапустите Apache, чтобы они вступили в силу. Возможно, стоит сначала остановить его, а затем запустить заново.
Дополнительные проверки
-
Логи ошибок: Если проблема продолжает существовать, посмотрите логи ошибок Apache и PHP. Возможно, там будет более конкретная информация о том, что идет не так.
-
Используйте правильную архитектуру: Убедитесь, что используете 64-битные версии PHP и Apache (или 32-битные), чтобы избежать конфликтов между архитектурами.
Заключение
Если после выполнения всех этих шагов cURL всё ещё не загружается, возможно, потребуется удалить версию PHP и установить её заново, убедившись, что используются все правильные зависимости и файлы. Иногда простая переустановка может помочь исправить недостающие или поврежденные файлы.
Надеюсь, эти рекомендации помогут вам справиться с проблемой. Если остались вопросы, не стесняйтесь задавать их.