此代码总是失败(即,$result
是布尔false
):
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $path);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_NOBODY, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$curl_version = curl_version();
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 999);
$result = curl_exec($ch);
curl_close($ch);
此代码总是成功的(即,$result
是一个包含头的字符串):
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $path);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_NOBODY, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$curl_version = curl_version();
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 1000);
$result = curl_exec($ch);
curl_close($ch);
唯一的区别是我将超时从999ms更改为1000ms。
这一定是curl中的一个错误,或者是文档中关于我错过的连接超时的某种最小值。是哪一个?我赌后者。
from: http://www.php.net/manual/en/function.curl-setopt.php
尝试连接时等待的毫秒数。使用0表示无限期等待。如果libcurl被构建为使用标准的系统名称解析器,那么该部分连接仍然会对超时使用全秒解析,最小超时时间为1秒。
处理这个问题的另一种方法是除了将CURLOPT_CONNECTTIMEOUT_MS
选项设置为1之外,还将CURLOPT_NOSIGNAL
选项设置为1。详见http://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html