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.dll
和ssleay32.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.dll
和 ssleay32.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.dll
和 php_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"
来加载cURL
和PgSQL
扩展。 无需移动文件。只需在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.dll
、libssh2.dll
、ssleay32.dll
文件放在httpd.conf
的ServerRoot 指令中指定的目录下。这些dll可以在php根文件夹下找到编译。
原因:
问题是php_curl.dll
需要在加载时访问以下库:libeay32.dll
、libssh2.dll
、ssleay32.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.dll
和libcrypto-1_1.dll
从我的php7.2.8/ext
文件夹复制到apache2.4.23/bin
文件夹才能使其正常工作。在此之前,我在php_curl.dll
和php_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 始终无法加载的原因 及解决办法