PHP cURL超时无法正常工作

5
我遇到了服务器问题。我正在运行本地服务器(用于开发),并且已经将我的本地服务器从MAMP更改为XAMPP。然而,使用XAMPP时,cURL选项CURLOPT_TIMEOUT_MSCURLOPT_CONNECTTIMEOUT_MS会给出以下错误提示:

警告:curl_setopt()函数期望第2个参数是long型,但实际传递的是字符串。

这是PHP或cURL版本的原因吗?还是配置设置的问题? curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT_MS, 2500); 附加信息:
  • OSX 10.6.8
  • PHP 5.3.1
  • cURL 7.19.7
提前致谢。
编辑:有一些混淆关于错误和要设置的变量。错误指出参数2无效,而不是参数3。所以CURLOPT_CONNECTTIMEOUT_MS似乎是个问题。
curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT_MS, 2500);
            ^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^^^^  ^^^^
parameter:     #1                 #2               #3

有趣的事实: var_dump(CURLOPT_CONNECTTIMEOUT_MS); 显示的是 string(25) "CURLOPT_CONNECTTIMEOUT_MS"。正如错误所述,它是一个字符串而不是浮点数。


@Sim,那是double/float,不是long,这应该行不通。 - Vyktor
@Sim 看看这个错误,它和第二个参数有关,即 CURLOPT_CONNECTTIMEOUT_MS 常量。我不认为我的问题在于设置的值。无论如何,我已经测试过了,也没有帮助。不管怎样,还是谢谢。 - Tim S.
你能为常量进行强制类型转换吗?就像(int)CURLOPT_CONNECTTIMEOUT_MS这样。我不完全确定这是否合法 :) - Sim
@SalmanA 我认为问题在于 PHP 本身,因为该常量不存在或无效。您提供的代码未显示我预期的 CURLOPT_CONNECTTIMEOUT_MS - Tim S.
顺便提一下,CURLOPT_CONNECTTIMEOUT_MS 在 *nix 操作系统上存在一个 bug/feature[http://www.php.net/manual/en/function.curl-setopt.php#104597]。通过 curl_setopt($soapAction, CURLOPT_NOSIGNAL, 1); 可以帮助我让 CURLOPT_CONNECTTIMEOUT_MS 正常工作。 - Dan Ramos
显示剩余5条评论
2个回答

8

出于某些原因,您的PHP版本中CURLOPT_CONNECTTIMEOUT_MS定义错误。建议检查您使用的PHP发行版,了解是否存在普遍性错误。

正确的值为156:您可以使用此值代替:

curl_setopt($this->ch, /*CURLOPT_CONNECTTIMEOUT_MS */ 156, 2500);

注意,你真的真的真的需要添加注释,解释为什么要这样做。


谢谢您的回答,但我可以问一下您是如何知道解决方案的吗?关于CURL超时不起作用的问题,SO和其他地方有很多相关的问题 - 是否可能类似的修复方法也适用于CURLOPT_TIMEOUT不起作用的情况?我和其他人都遇到了这个问题。如果您认为这是正确的方式,我可以为此开一个新的问题。总之,我可以问一下提供您答案中的“156”文档在哪里吗? - Geoff Kendall
@GeoffKendall 抱歉,我写下这个答案已经有很长时间了。上面的评论显示了问题,但我不记得我可能做过什么研究。我通过执行 var_dump(CURLOPT_CONNECTTIMEOUT_MS); 在我的系统中获取了该值。我认为它没有在任何地方定义。 - lonesomeday
谢谢孤独的一天,我“闻了咖啡香”并在Google上搜索了它 - 它在这里http://laprbass.com/RAY_get_defined_constants.php以及其他地方。结果证明对我来说常量是好的,但检查一下也是值得的。 - Geoff Kendall

8

我曾经遇到过同样的问题,这个方法解决了我的问题。只需要在你的脚本顶部添加这一行代码即可。它定义了一个缺失的常量,仅当该常量未被定义时才会生效。

if (!defined(CURLOPT_CONNECTTIMEOUT_MS)) define('CURLOPT_CONNECTTIMEOUT_MS', 156);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接