PHP не может загрузить расширение php_curl.dll

Продолжение моего вчерашнего поста ( Включение cURL с PHP)

Проблема в том, что PHP не может загрузить php_curl.dll. Я пробовал несколько шагов, включая раскомментирование extension=php_curl.dll, убедившись, что зависимости libeay32.dll а также ssleay32.dll eixst в пути, повторно загрузив php_curl.dll, заменив старый и, наконец, скопировав файл в мою папку System32.

Я использую Apache 2.2 и PHP 5.4.14. Я установил оба, используя их отдельные пакеты; Я не использую XAMP или WAMP. Я использую Windows 7 64-bit.

Любая помощь будет оценена.

15 ответов

Решение

libeay32.dll а также ssleay32.dll должны быть доступны для пути php_curl.dll загрузка успешна.

Но копирование их в Apache ServerRootApache's \bin\Окна \System32\или, что еще хуже, основной каталог Windows является плохим хакером и может даже не работать с более новыми версиями PHP.

Правильный способ сделать это - добавить путь PHP в Windows. Path переменная. В Control Panel -> System нажмите на Дополнительные параметры системы и используйте кнопку Переменные среды. В системных переменных вы найдете Path переменная. Отредактируйте его и добавьте; C: \ PHP prepend C:\PHP; к нему - или каков путь к вашей папке PHP. Затем полностью остановите Apache и запустите его снова (простой перезагрузки может быть недостаточно).

Обновление 2017-05:
Я изменил приведенные выше инструкции, добавив переменную Path к пути PHP вместо добавления к нему. Это гарантирует, что библиотеки DLL в пути PHP используются, а не любые другие (устаревшие) версии в других путях системы.

Обновление 2018-04:
Если вы уже выбрали неправильный путь и скопировали любую из DLL-библиотек PHP в пути Apache или Windows, я настоятельно рекомендую удалить их снова! Если вы этого не сделаете, у вас могут возникнуть проблемы, когда вы позже попытаетесь обновить PHP. Если новая версия PHP приносит новые версии этих библиотек DLL, но ваши старые библиотеки DLL по-прежнему сохраняются в путях системы или веб-сервера, эти старые библиотеки DLL могут быть найдены первыми. Это наверняка предотвратит запуск интерпретатора PHP. Такие ошибки могут быть очень трудно понять и устранить. Поэтому лучше очистить сейчас и удалить любые из упомянутых DLL-файлов из путей Windows и Apache, если вы их там скопировали.
(Спасибо @EdmundTam и @WasimA. За то, что указали на эту проблему в комментариях!)

WINDOWS Apache 2.4.x + PHP 7.0.x РЕШЕНИЕ ЗДЕСЬ:

Решение: Поместите файлы libeay32.dll, libssh2.dll, ssleay32.dll в каталог, указанный в директиве httpR.conf ServerRoot. Эти библиотеки могут быть скомпилированы в корневой папке php.

Причины:

Проблема в том, что php_curl.dll требует доступа к следующим библиотекам во время загрузки: libeay32.dll, libssh2.dll, ssleay32.dll, и это не имеет смысла, если вы помещаете их в./php/ext dir или если вы помещаете расширения php в корень php реж.

Конечно, вы можете поместить их в c:\Windows или в какую-то глобальную папку, определенную в PATH, но если вы не хотите этого делать и хотите, чтобы ваша установка apache+php была переносимой:

Путь, указанный в ServerRoot в httpd.conf, рассматривается как домашний путь для php. Поведение аналогично ситуации, когда вы включаете файл./path/to/some.php в./index.php, а домашний путь для файла some.php по-прежнему./ dir, где находится index.php.

В шортах просто поместите эти три dll прямо в dir, который вы указали в httpd.conf директиве ServerRoot, и php_curl.dll не сможет снова загрузиться.

В версии PHP 5.6.x Вы должны сделать следующее:

Переместить в Windows\system32 папки DLL от php папка:

libssh2.dll, ssleay32.dll, libeay32.dll а также php_curl.dll от php ext папка

Переместить в Apache24\bin папка из php папка:

libssh2.dll

Кроме того, не забудьте раскомментировать extension=php_curl.dll в php.ini

Вы загружаете .dll так что ваша ОС должна быть windows.

Первая проверка, которая php.ini файл, который вы используете, запустив phpinfo()

Затем проверьте, где находится ваша папка расширений, проверив extension_dir атрибут в этом файле.

Затем убедитесь, что php_curl.dll присутствует в этой папке. Если не скопировать его.

Запустить снова apache и проверьте, работает ли он.

Так как вы установили пакеты индивидуально, также сделайте это:

Скопируйте файл DLL из php_installation_folder/extensions в apache_installation_folder/bin

Обычно это ошибка несоответствия версии OpenSSL между Apache и PHP. В случае, если Apache загружает PHP как модуль DSO, будут использоваться его собственные версии OpenSSL (dll и libs). Таким образом, если расширение PHP требует более новой версии, оно может не найти соответствующий интерфейс внутри DLL-библиотеки, загруженной Apache, и работать не будет.

Поскольку для загрузки требуется расширение PHP, необходимо, чтобы соответствующие файлы DLL были как минимум той версией, которую запрашивает модуль PHP. Предположим, что вы используете последние сборки как для Apache, так и для PHP, и обе они были собраны с одной и той же версией MVC, вы можете скопировать следующие файлы:

  • libcrypto-1_1.dll
  • libcrypto-1_1-x64.dll
  • libcurl.dll
  • libsasl.dll
  • libssh2.dll
  • libssl-1_1.dll
  • libssl-1_1-x64.dll
  • nghttp2.dll
  • libeay32.dll (если есть в вашем дистрибутиве PHP)
  • ssleay32.dll (если есть в вашем дистрибутиве PHP)

из корневой папки PHP в папку Apache2/bin, если вы уверены, что сборка PHP новее, чем сборка Apache.

В противном случае вы можете скопировать те же файлы из Apache BIN в корень PHP.

В любом случае, сделайте резервную копию содержимого папок APache и PHP заранее.

Добавление пути PHP в качестве переменной среды даст этому пути приоритет для загрузки соответствующих DLL и может решить проблему. Однако вы теряете в переносимости сервера. Кроме того, если вы также добавили Apache PATH в качестве переменной и версии OpenSSL сильно различаются (вплоть до загрузки разных связанных DLL-файлов), может произойти много дерьма.

Попробовав все здесь, мне пришлось просто обновить Apache до более новой версии, чтобы сделать curl расширение работы.

Я обновлял PHP с 7.0.2 до 7.1.15, после чего curl не работал. Единственный способ исправить это - обновить Apache (версия 2.4.18) до последней версии 2.4.29.

Не нужно было копировать какие-либо файлы lib/ssleay dll в Apache или Windows - возможно, потому что у меня уже есть папка PHP в моем системном пути.

Работает под управлением Windows 10, 64-битная, многопоточная версия, VC14.

Вставить в файл httpd.conf

LoadFile "D:/DevKit/PHP7.1/libeay32.dll"
LoadFile "D:/DevKit/PHP7.1/libssh2.dll"
LoadFile "D:/DevKit/PHP7.1/ssleay32.dll"

В php.ini вы должны указать статический путь extension_dir. extension_dir = "C:\laragon\bin\php\php-7.3.11-Win32-VC15-x64\ext"своим примером. Не забудьте удалить точку с запятой перед этой переменной.

Решение:

Step1: Uncomment the php_curl.dll from php.ini

Step2: Copy the following three files from php installed directory.i.e "C:\\php7".

libeay32.dll,
libssh2.dll,
ssleay32.dll

Step3: Paste the files under two place

httpd.conf's ServerRoot directive. i.e "C\Apache24"
apache bin directory. i.e "C\Apache24\bin"

Step4: Restart apache.

Это все. Я решаю проблему таким способом. Надеюсь, это может сработать для вас.

Решение дано здесь. https://abcofcomputing.blogspot.com/2017/06/php7-unable-to-load-phpcurldll.html

Убедитесь, что ваш Apache SSH DLL загружается правильно. При новой установке мне пришлось скачать и загрузить в мой каталог apache bin следующую DLL "libssh2.dll"

После загрузки ssl dll cURL смог загрузить без проблем.

Вы можете скачать его по ссылке ниже:

http://windows.php.net/downloads/pecl/releases/ssh2/0.12/

Я сталкивался с той же проблемой раньше. Я решил ее, добавив каталог php в системные переменные среды Windows --- Путь.

Добавьте путь к папке php в системный путь, и все должно работать нормально. Это также исправит некоторые другие расширения, которые сломаны.

Наиболее правильным и чистым способом является использование директивы FileLoad.

У меня есть несколько наборов Apache-PHP на ПК. Установка PATH для одного каталога PHP создает проблемы в другой версии PHP.

Конечно, я не хочу никуда копировать dll-файлы.

Мне нужен был только один файл: libssh2.dll.
Я добавил его во вложение директивы IfModule:

      # PHP7 module
LoadModule php7_module "../../../PHP/App/v7.3.1/php7apache2_4.dll"
<IfModule php7_module>
    <FilesMatch \.php$>
        SetHandler application/x-httpd-php
    </FilesMatch>
    PHPIniDir "../../../PHP/App/v7.3.1"
    LoadFile "../../../PHP/App/v7.3.1/libssh2.dll"
</IfModule>

Я могу иметь отдельный файл конфигурации с директивами PHP для конкретных версий PHP и выбирать, какие из них включать во время запуска httpd.

LoadFile также предлагается в комментарии @BlitZ под одним из ответов.
И позже в ответе @Leon Lam.

Возможно, это не лучший подход, но он определенно работает. (2019-2022)

«В вашей установке PHP не включено расширение php_curl.dll».

  1. найдите «php.ini», если нет, вам нужно переименовать «php.ini-development» в «phh.ini». Откройте его.

  2. найти ;extension_dir = "ext"

  3. добавьте их под этой строкой, там нет ";"

      extension_dir = "[php dir]\ext"
extension=php_curl.dll

Я получил эту ошибку, потому что, по крайней мере, в моей системе, если extension_dir в php.ini задан относительный путь, он считается относительным к корневому каталогу Apache, поэтому, чтобы он указывал на правильный каталог, мне пришлось использовать абсолютный путь: "C:\Program Files (x86)\PHP\ext", (Это был PHP 5.5.31 и Apache 2.4.23 в Windows 10; настройка extension_dir в ext с той же настройкой в ​​Windows 7 работал нормально. Сначала я запустил его, поместив каталог ext в папку Apache с необходимыми dll, а затем выяснил, что происходит.)

Также необходимо было правильно задать PATH или убедиться, что упомянутые выше dll (libeay32.dll, libssh2.dll и ssleay32.dll) находятся в каталоге bin Apache (или, скорее всего, в любом из мест, упомянутых в других ответах). Тот факт, что я получил то же сообщение об ошибке, что Apache не может найти lib_curl.dll, так как он не может найти libssh2.dll, не облегчает задачу.

Другие вопросы по тегам