CURL调用的控制超时不起作用

时间:2014-08-19 11:08:51

标签: php curl timeout

我需要使用CURL调用外部服务,问题是有时它需要很长的响应时间,并且我的页面会被暂停,直到它收到响应。

我使用了CURLOPT_CONNECTTIMEOUT和CURLOPT_TIMEOUT选项但没有效果。我读到了CURL,也使用了" default_socket_timeout"变量,但请求总是需要55秒才能被取消。

似乎CURL会忽略任何选项或配置。

ini_set("max_execution_time", 10);
ini_set("default_socket_timeout", 10);
set_time_limit(5);

$start = time();

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://localhost/test/sleep.php');

curl_setopt($curl, CURLOPT_USERAGENT, $headers);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_MAXREDIRS, 5);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLINFO_HEADER_OUT, true);
curl_setopt($curl, CURLOPT_HEADER, false);

curl_setopt($curl, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($curl, CURLOPT_NOSIGNAL, 1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 3);
curl_setopt($curl, CURLOPT_TIMEOUT, 8);

curl_exec($curl);

$end = time() - $start;
echo '>>>'.$end.'<<<';

输出:

>>>55<<

注意: sleep.php 只有无限循环。我在服务器中看到:max_execution_time为60,default_socket_timeout为30,之后我将其更改为10秒。

1 个答案:

答案 0 :(得分:1)

您的配置正确并按预期工作。问题是curl能够连接到你的脚本(sleep.php),因此不会触发连接超时。 55秒可能来自max_execution_time。

尝试连接到随机的ip-address而不是localhost,你会看到connection-timeout正在工作。

编辑: 还有CURLOPT_TIMEOUT正在运行,我用一个包含无限循环的脚本来测试它,并且curl-request在8秒后停止。