我需要使用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秒。
答案 0 :(得分:1)
您的配置正确并按预期工作。问题是curl能够连接到你的脚本(sleep.php),因此不会触发连接超时。 55秒可能来自max_execution_time。
尝试连接到随机的ip-address而不是localhost,你会看到connection-timeout正在工作。
编辑: 还有CURLOPT_TIMEOUT正在运行,我用一个包含无限循环的脚本来测试它,并且curl-request在8秒后停止。