cURL超时,你能优雅地处理吗?

Jui*_*icy 9 php curl fatal-error

如果从服务器获取响应需要超过30秒,则cURL会使PHP抛出致命错误.这似乎在我的网络应用程序中发生了很多,特别是如果其他服务器很忙.用户真的不太明白.

我想要捕获超时并自己显示一个很好的消息,或者我想知道是否有一种方法可以继续使用PHP脚本的其余部分,因为即使没有该脚本的其余部分也可以执行来自服务器的响应(具有默认值).

我真的不明白为什么cURL会抛出致命错误而不是警告超时.这是一个真正的痛苦.

ces*_*oid 6

这是对这个问题的一个更直接的答案.也就是说,卷曲仍然会在30秒后停止,但是如果你愿意,你可以抓住错误并继续前进.

ini_set('max_execution_time', 40); // prevents 30 seconds from being fatal

$ch = curl_init();

curl_setopt($ch, CURLOPT_TIMEOUT, 30); // curl timeout remains at 30 seconds
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_exec($ch);

if ($error_number = curl_errno($ch)) {
    if (in_array($error_number, array(CURLE_OPERATION_TIMEDOUT, CURLE_OPERATION_TIMEOUTED))) {
        print "curl timed out";
    }
}

curl_close($ch);
Run Code Online (Sandbox Code Playgroud)

如果您无法控制max_execution_time,则可以稍微降低卷曲超时.


Sha*_*ran 5

使用这些参数增加cURL超时

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,0); 
curl_setopt($ch, CURLOPT_TIMEOUT, 500);
Run Code Online (Sandbox Code Playgroud)

由于您提到30秒,我怀疑您的PHP脚本超时已用完.所以将它添加到您的PHP代码中.

set_time_limit(0);// 0 is infite limit 
Run Code Online (Sandbox Code Playgroud)

  • 当然,在开发时将 time_limit 增加到无穷大,但这对生产来说是一个糟糕的主意。 (3认同)