我的curl调用没有在Apache / PHP上启用。我的PHP版本是5.6.3(x32),Apache是2.4
我已经取消注释了在C:/PHP/php.ini中启用curl的行:
extension=php_curl.dll
另外,我确保在我的路径变量中包含PHP路径和PHP ext路径,以便启用PHP文档中指定的ssleay32.dll
和libeay32.dll
。这是路径:
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files\TortoiseSVN\bin;C:\PHP;C:\PHP\ext;C:\Apache24\bin;C:\xampp\apache\bin;C:\Ruby193\bin;C:\xampp\apache\bin"
但是,经过多次重启后,我仍然在日志中收到此错误:
PHP Fatal error: Call to undefined function curl_init() in C:\\Apache24\\htdocs\\user\\newapi\\test.php on line 5, referer: http://localhost/newapi/
答案 0 :(得分:0)
我知道这很明显,但首先要检查的是PHP配置,确保curl没有列在其中:
disable_functions=
disable_classes=
在检查php设置时,请确保您拥有(基于您的路径):
extension_dir="C:\PHP\ext"
再次验证C:\ PHP \ ext \ php_curl.dll确实存在,并且它不是从XAMPP安装中复制的。
之后,根据您启动Apache的方式(使用系统帐户或作为用户的服务),除了系统路径之外,您可能还需要检查用户路径。
在某个时间点,我发现我有多个ssleay32.dll和libeay32.dll副本,这些副本在PHP二进制文件之前被调用,导致版本冲突。我已经列举了一个我遇到的麻烦的例子。
要查看正在使用的完整路径(假设Apache正在从用户空间运行):
C:\> echo %PATH%
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\curl;C:\Program Files\curl\dlls;C:\Web\php;C:\Python27;
在这台机器上,这些条目来自我的用户路径,而不是系统路径:
C:\Program Files\curl;C:\Program Files\curl\dlls;C:\Web\php;C:\Python27;
检查路径中已安装文件的位置:
C:\> where ssleay32.dll
C:\Program Files\curl\dlls\ssleay32.dll
C:\Web\php\ssleay32.dll
C:\>
在这个例子中,包含我的curl和php构建的dll相距甚远,它们彼此不兼容。 PHP试图加载curl的dll,但失败了。我没有安装它所以我现在无法检查,但TortoiseSVN可能包括它们。
可能还需要验证文件的权限:
C:\> cacls c:\Web\php\ssleay32.dll
C:\Web\php\ssleay32.dll BUILTIN\Administrators:(ID)F
NT AUTHORITY\SYSTEM:(ID)F
BUILTIN\Users:(ID)R
NT AUTHORITY\Authenticated Users:(ID)C
作为旁注,将文件复制到%SystemDrive%\ Windows \ System32是个坏主意。它基本上只是将任何文件放入系统路径(在优先级位置)而不必向用户解释如何编辑路径变量的黑客攻击。