PHP 无法加载 php_curl.dll 扩展

Posted

技术标签:

【中文标题】PHP 无法加载 php_curl.dll 扩展【英文标题】:PHP unable to load php_curl.dll extension 【发布时间】:2013-05-01 16:56:45 【问题描述】:

我昨天帖子的跟进 (Enabling cURL with php)

问题是 PHP 无法加载 php_curl.dll。我尝试了几个步骤,包括取消注释extension=php_curl.dll,确保路径中的依赖项libeay32.dllssleay32.dll eixst,重新下载php_curl.dll,替换旧的,最后将文件复制到我的System32 文件夹中。

我使用的是 Apache 2.2 和 PHP 5.4.14。我使用它们各自的软件包安装了它们;我没有使用 XAMP 或 WAMP。我使用的是 Windows 7 64 位。

任何帮助都将不胜感激。

【问题讨论】:

Enabling cURL with PHP的可能重复 我遇到了这个问题,有一个解决方案,我认为我不会在不违反规则的情况下给出。 - ---删除--如果这确实违反了规则,请编辑/删除谢谢 同样的问题,但该线程没有答案 我使用各自的软件包安装了 PHP 和 Apache。我将编辑我的帖子以反映这一点。不过感谢您的回复! 确定编辑您的问题以不包括其他工具,只是说干净安装不使用第 3 方程序 【参考方案1】:

您正在加载 .dll,因此您的操作系统必须是 windows。

首先通过运行phpinfo()检查您使用的是哪个php.ini文件

然后通过检查该文件中的extension_dir 属性来检查您的扩展文件夹在哪里。

接下来确保php_curl.dll 存在于该文件夹中。如果不复制过来。

重启apache并检查它是否有效。

由于您单独安装了软件包,因此也可以这样做:

将dll文件从php_installation_folder/extensions复制到apache_installation_folder/bin

【讨论】:

好的,您正在运行哪个 PHP?是64位的吗?如果您正在运行 64 位 PHP,并且具有 32 位 curl dll,您可能会收到此错误。实际上,这已经包含在 SO 中。 ***.com/questions/10939248/… 我正在运行 32 位 PHP,而且我很确定 curl dll 也是 x86(安装时附带)。我已经查看了您链接的帖子,并且由于所有固定的 dll 都是针对 x64 PHP 的,因此我无法使用它。我第一次安装 PHP (windows.php.net/download/#php-5.4) 时没有看到 x64 版本,所以这就是我安装 32 位的原因:P 你认为我应该找到并安装 x64 PHP 吗?再次感谢您的帮助,非常感谢。 我认为您不需要这样做。您是否也将依赖项复制到 apache/bin 中? 哦!我没有,现在它有效!太感谢了!!您介意解释为什么需要将 dll 放在 apache/bin 中吗?我以为只有 PHP 需要看到它们?再次感谢,我一直在努力解决这个问题。 @user2066880 太好了!当您为 Apache 和 PHP 分别安装时会发生什么,我认为 PHP 是作为 CGI 模块安装的(这与 CLI 不同)而不是正确的 apache 扩展。这意味着 php 将请求 apache 加载(某些)扩展,而 apache 自然会检查它的 bin 文件夹并告诉 PHP 是否得到它。这就是 PHP 给出错误信息的原因。我曾经知道如何解决这个问题,但是自从我使用单独的配置以来已经有好几年了。很高兴它起作用了! :-)【参考方案2】:

libeay32.dllssleay32.dll 必须是路径可访问的,php_curl.dll 加载才能成功。

但是将它们复制到 Apache 的 ServerRoot、Apache 的 \bin\、Window 的 \System32\,或者更糟的是复制到 Windows 主目录中是一种糟糕的 hack,甚至可能不适用于较新的 PHP 版本。

正确的做法是将 PHP 路径添加到 Windows Path 变量中。

    Control Panel -> System点击高级系统设置或按WIN+R并输入SystemPropertiesAdvanced 点击按钮环境变量。 在系统变量下,您将找到Path 变量。编辑它并将 C:\PHP; 添加到它之前 - 或者您的 PHP 文件夹的路径是什么。 (提示:如果您的 PHP 文件夹包含像 C:\Program Files\PHP 这样的空格,您可能需要在此处使用短文件名形式,即 C:\Progra~1\PHP。) 然后完全停止 Apache 并重新启动(简单的重启可能不够)。

2017-05 更新: 我将上面的说明更改为 prepend Path 变量和 PHP 路径,而不是 appending 到它。这可以确保使用 PHP 路径中的 DLL,而不是系统其他路径中的任何其他(过时)版本。

2018-04 更新: 如果您已经选择了错误的方式并将任何 PHP DLL 复制到 Apache 或 Windows 路径,那么我强烈建议您再次删除它们!如果不这样做,您以后尝试更新 PHP 时可能会遇到麻烦。如果新的 PHP 版本带来了这些 DLL 的新版本,但您的旧 DLL 仍然在系统或网络服务器路径中徘徊,则可能首先找到这些旧 DLL。这肯定会阻止 PHP 解释器启动。此类错误可能很难理解和解决。所以最好现在清理并从 Windows 和 Apache 路径中删除任何提到的 DLL(如果您将它们复制到那里)。 (感谢@EdmundTam 和@WasimA。在 cmets 中指出了这个问题!)

2019-10 更新: 提示:要查找这些 DLL 的所有副本并检查是否将它们放置在错误的文件夹中,您可以在 Windows 命令提示符窗口中使用以下命令:

dir c:\libeay32.dll /s
dir c:\ssleay32.dll /s

请注意,这些命令在搜索系统驱动器 C: 的整个目录结构时可能需要一些时间才能完成。

2020-08 年更新: 如果您的 PHP 文件夹包含空格(即C:\Program Files\PHP),您可能需要在步骤 3 中使用Path 变量中的短文件名形式(即C:\Progra~1\PHP)。感谢 @onee 的提示!

【讨论】:

这对我来说终于奏效了——不需要自定义 dll 废话。 将 PHP 目录添加到 PATH 变量是我要做的事情。谢谢。 只是想补充一点,在添加 PATH 变量后使用 -k restart 重新启动 apache 对我来说还不够。我不得不完全停止它然后重新启动它。 这对我有用,但我只想补充一点,我必须重新启动 Windows 才能使其正常工作。仅仅重启 Apache 是不够的。 对我来说,我需要删除复制到 apache\bin 和 system32 的 libeay32.dll、libssh2.dll、ssleay32.dll 和 nghttp2.dll。我什至忘记了我是什么时候将nghttp2.dll复制到apache\bin的,我花了一个多星期才弄明白。【参考方案3】:

确保正确加载您的 apache SSH dll。在全新安装时,我必须下载并加载到我的 apache bin 目录中,以下 dll “libssh2.dll”

加载 ssl dll 后,cURL 能够毫无问题地加载。

您可以从以下链接下载:

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

【讨论】:

将这个库从 php bin 复制到 apache bin 目录对我有用。【参考方案4】:

在 PHP 5.6.x 版本中您应该执行以下操作:

php 文件夹移至Windows\system32 文件夹DLL:

libssh2.dll, ssleay32.dll, libeay32.dllphp_curl.dll 来自 php ext 文件夹

php 文件夹移动到Apache24\bin 文件夹:

libssh2.dll

另外,不要忘记在php.ini 中取消注释extension=php_curl.dll

【讨论】:

只需将libssh2.dll 文件复制到Apache24\bin 即可。谢谢!好奇怪哦。O 这对我在 Win7 x64 上的 PHP 7 (x64) + Apache 2.4.18 (x64) 帮助很大。但是我只是使用LoadFile "[path to php]\libpq.dll"LoadFile "[path to php]\libssh2.dll" 来加载cURLPgSQL 扩展。 无需移动文件。只需在httpd.conf 中使用LoadFile 指令加载它们。 不需要将libssh2.dll复制到apache @Num6 我尝试了很多天,但它不起作用。你能解释一下你成功地做了php7,apache2.4,我在win10 x64上。请在某处上传您的 dll 文件。 将 libssh2.dll 文件复制到 Apache24\bin 也对我有用【参考方案5】:

WINDOWS Apache 2.4.x + PHP 7.0.x 解决方案在这里:

解决方案:将libeay32.dlllibssh2.dllssleay32.dll 文件放在httpd.conf 的ServerRoot 指令中指定的目录下。这些dll可以在php根文件夹下找到编译。

原因:

问题是php_curl.dll 需要在加载时访问以下库:libeay32.dlllibssh2.dllssleay32.dll,如果将它们放在 ./php/ext 目录中或将 PHP 扩展放在PHP 根目录。

当然,您可以将它们放在C:\Windows 或 PATH 中定义的某个全局文件夹中,但如果您不想这样做并且希望您的 apache+php 安装是可移植的:

httpd.conf 中的ServerRoot 中指定的路径被视为 php 的主路径。该行为类似于您在 ./index.php 中包含 ./path/to/some.php 文件且 some.php 文件的主路径仍为 ./ 的情况,index.php 所在的目录。

简而言之,只需将这三个 dll 放在您在 httpd.conf ServerRoot 指令中指定的目录中,php_curl.dll 将不会再次加载失败。

【讨论】:

我必须将 dll 放在 apache 的 bin 目录中(并替换现有的)才能使其工作。 是的,将这些文件从我的 PHP 目录放入 Apache24/bin 并重新启动 Apache 对我有用。谢谢! 如果您有多个虚拟主机,您真的会将 PHP 文件复制到每个 ServerRoots 中吗?我认为这很难维护,很难更新,因此是一个非常糟糕的 hack。尝试路径解决方案。它干净且可维护。 @Jpsy 您在谈论与 ServerRoot 路径不同的 VirtualHost 目录。 VirtualHosts 具有相同的 ServerRoot 和不同的 Directory。 不幸的是,如果您使用安装了 多个 版本的 PHP 的 WAMP,这不是一个很好的解决方案,因为我预计它们可能都有自己的这些 DLL 版本。 WAMP 似乎用符号链接处理了这方面的某些方面,但我不确定它是如何配置它们的。【参考方案6】:

我之前也遇到过同样的问题,我通过将php目录添加到windows系统环境变量---Path来解决的。

【讨论】:

【参考方案7】:

我得到这个错误是因为,至少在我的系统上,如果 php.ini 中的 extension_dir 设置为相对路径,它被认为是相对于根 Apache 目录,所以让它指向正确的目录我必须使用绝对路径:"C:\Program Files (x86)\PHP\ext"。 (这是 Windows 10 上的 PHP 5.5.31 和 Apache 2.4.23;将 extension_dir 设置为 ext 与 Windows 7 上的相同设置工作得很好。我首先通过在 Apache 文件夹中放置一个 ext 目录来使其工作使用必要的 dll,然后弄清楚发生了什么。)

还需要正确设置 PATH 或确保上面提到的 dll(libeay32.dll、libssh2.dll 和 ssleay32.dll)在 Apache 的 bin 目录中(或者很可能是其他答案提到的任何地方) . Apache 无法找到 lib_curl.dll 和无法找到 libssh2.dll 的错误消息相同,这一事实并没有让事情变得更容易弄清楚。

【讨论】:

【参考方案8】:

将您的 php 文件夹路径添加到系统 PATH 中,一切正常。它还将修复一些其他损坏的扩展。

【讨论】:

【参考方案9】:

解决方案:

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

【讨论】:

【参考方案10】:

在这里尝试了所有方法后,我只需要将 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。

【讨论】:

【参考方案11】:

插入到文件 httpd.conf

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

【讨论】:

在我将我的PHP版本更新到7.4.0 RC4之前,上面@Jpsy提供的方法解决了这个问题。更新后,您的方法解决了问题。谢谢。【参考方案12】:

这通常是 Apache 和 PHP 之间的 OpenSSL 版本不匹配错误。如果 Apache 将 PHP 作为 DSO 模块加载,将使用其自己的 OpenSSL 版本(dll 和 lib)。因此,如果 PHP 扩展需要更新的版本,它可能无法在 Apache 加载的 DLLS 中找到合适的接口,从而无法工作。

由于您需要加载 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 文件),可能会发生很多事情。

【讨论】:

我必须将libssl-1_1.dlllibcrypto-1_1.dll 从我的php7.2.8/ext 文件夹复制到apache2.4.23/bin 文件夹才能使其正常工作。在此之前,我在php_curl.dllphp_openssl.dll 上收到“无法加载动态库”,尽管这些文件存在于正确的位置。【参考方案13】:

在 php.ini 中你必须放置 extension_dir 静态路径。 extension_dir = "C:\laragon\bin\php\php-7.3.11-Win32-VC15-x64\ext" 举例。不要忘记删除此变量之前的分号。

【讨论】:

以上是关于PHP 无法加载 php_curl.dll 扩展的主要内容,如果未能解决你的问题,请参考以下文章

php_curl.dll libssh2.dll 始终无法加载的原因 及解决办法

加载php_curl.dll和php_openssl.dll出错原因及解决办法

Apache 不会加载 php_curl.dll

必须加载 PHP 扩展“curl”

PHP开启cURL功能

php5.6开启curl