为什么 PHP 拒绝在 Windows 上启用 cURL
Why does PHP refuse to enable cURL on Windows
我在 Windows 7 x64
上使用 PHP 5.5.25
和 Apache 2.4
,但我无法激活 cURL 模块。我环顾四周,尝试了所有我能想到的。请协助:
- 在
php.ini
中,行 extension=php_curl.dll
处于活动状态并且文件 php_curl.dll
存在于扩展目录 C:\php\ext
中
- 在
php.ini
时我设置了extension_dir = ext
,扩展加载none。 Apache 启动时我收到几条消息,类似于 Unable to load dynamic library
ext\php_openssl.dll- The specified module could not be found.
- 当我使用完整路径并设置
extension_dir = C:\php\ext
时,所有扩展都能正常加载,但 cURL 除外。我收到错误:Unable to load dynamic library
C:\php\ext\php_curl.dll- The specified module could not be found.
- 我已尝试将扩展名重命名为
php_curl.new.dll
并调整 php.ini
但我收到有关新文件名的错误消息。我还从 windows.php.net
下载了 DLL 的全新副本,但这没有任何区别。
- 我检查了
php_curl.dll
的文件权限(右键单击文件 >> 属性 >> 安全选项卡),它们与成功加载的扩展程序的权限相同
- 我已经按照对this question
- 我确定我正在编辑正确的
php.ini
,因为当我将 extension_dir
值从 ext
更改为 [=18 时 PHP 启动错误消息发生了变化=] 正如我上面所解释的。
- 我已确保在
php.ini
配置更改之间重新启动 Apache 服务器。
- 如果在 PHP 脚本中执行
var_dump(file_exists('C:\php\ext\php_curl.dll'));
,我会得到 boolean True
所以 PHP 可以看到文件!
还有什么可以解释为什么未启用 cURL 模块?
我认为您的 PATH
中也需要 libssh2.dll
。
在 windows 上,cURL 执行需要 SSL 证书。可能是因为显示其他错误。
将以下代码放在 curl_exec(curlHandle) 之前以忽略对 SSL 证书的检查
//to ignore the SSL certificate in windows
curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER,false);
感谢@Steven Hilder 为我指明了正确的方向。
问题是 Windows 无法看到 libssh2.dll
,PHP 目录中的另一个 DLL。将此文件复制到 C:\Windows\SysWOW64
和 C:\Windows\System32
,以及我的 OP 中的其他两个 DLL 文件(libeay32.dll
和 ssleay32.dll
)工作正常。
虽然我对这个解决方案感到不舒服,因为当需要更新到新的 PHP 版本时,我将很难记住用新版本覆盖这些 DLL。
因此,我决定从 System32
和 SysWOW64
目录中删除所有 3 个 DLL。相反,我只是将 PHP bin 目录添加到 Windows' PATH 变量,这样下次 OS 查找丢失的文件时,它也会在该目录中查找。这有额外的好处,如果另一个 DLL 出现类似的问题,它将自动解决。
将 PHP bin 添加到 Windows' PATH:
- 从
Start Menu
搜索栏中搜索 select Advanced system settings
- 点击
Environment Variables
。向下滚动系统变量列表到 select Path
然后单击 Edit...
打开当前的 PATH 设置
- 将
;C:\php
或任何具有 php.exe
的目录附加到当前设置(分号用于分隔路径)。
我在 Windows 7 x64
上使用 PHP 5.5.25
和 Apache 2.4
,但我无法激活 cURL 模块。我环顾四周,尝试了所有我能想到的。请协助:
- 在
php.ini
中,行extension=php_curl.dll
处于活动状态并且文件php_curl.dll
存在于扩展目录C:\php\ext
中
- 在
php.ini
时我设置了extension_dir = ext
,扩展加载none。 Apache 启动时我收到几条消息,类似于Unable to load dynamic library
ext\php_openssl.dll- The specified module could not be found.
- 当我使用完整路径并设置
extension_dir = C:\php\ext
时,所有扩展都能正常加载,但 cURL 除外。我收到错误:Unable to load dynamic library
C:\php\ext\php_curl.dll- The specified module could not be found.
- 我已尝试将扩展名重命名为
php_curl.new.dll
并调整php.ini
但我收到有关新文件名的错误消息。我还从windows.php.net
下载了 DLL 的全新副本,但这没有任何区别。 - 我检查了
php_curl.dll
的文件权限(右键单击文件 >> 属性 >> 安全选项卡),它们与成功加载的扩展程序的权限相同 - 我已经按照对this question
- 我确定我正在编辑正确的
php.ini
,因为当我将extension_dir
值从ext
更改为 [=18 时 PHP 启动错误消息发生了变化=] 正如我上面所解释的。 - 我已确保在
php.ini
配置更改之间重新启动 Apache 服务器。 - 如果在 PHP 脚本中执行
var_dump(file_exists('C:\php\ext\php_curl.dll'));
,我会得到boolean True
所以 PHP 可以看到文件!
还有什么可以解释为什么未启用 cURL 模块?
我认为您的 PATH
中也需要 libssh2.dll
。
在 windows 上,cURL 执行需要 SSL 证书。可能是因为显示其他错误。
将以下代码放在 curl_exec(curlHandle) 之前以忽略对 SSL 证书的检查
//to ignore the SSL certificate in windows
curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER,false);
感谢@Steven Hilder 为我指明了正确的方向。
问题是 Windows 无法看到 libssh2.dll
,PHP 目录中的另一个 DLL。将此文件复制到 C:\Windows\SysWOW64
和 C:\Windows\System32
,以及我的 OP 中的其他两个 DLL 文件(libeay32.dll
和 ssleay32.dll
)工作正常。
虽然我对这个解决方案感到不舒服,因为当需要更新到新的 PHP 版本时,我将很难记住用新版本覆盖这些 DLL。
因此,我决定从 System32
和 SysWOW64
目录中删除所有 3 个 DLL。相反,我只是将 PHP bin 目录添加到 Windows' PATH 变量,这样下次 OS 查找丢失的文件时,它也会在该目录中查找。这有额外的好处,如果另一个 DLL 出现类似的问题,它将自动解决。
将 PHP bin 添加到 Windows' PATH:
- 从
Start Menu
搜索栏中搜索 selectAdvanced system settings
- 点击
Environment Variables
。向下滚动系统变量列表到 selectPath
然后单击Edit...
打开当前的 PATH 设置 - 将
;C:\php
或任何具有php.exe
的目录附加到当前设置(分号用于分隔路径)。