【发布时间】:2016-07-10 20:09:27
【问题描述】:
我有一个 PHP 脚本,它通过 cURL 连接到一个 URL,然后根据返回的 HTTP 状态代码执行一些操作:
$ch = curl_init();
$options = array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_URL => $url,
CURLOPT_USERAGENT => "What?!?"
);
curl_setopt_array($ch, $options);
$out = curl_exec($ch);
$code = curl_getinfo($ch)["http_code"];
curl_close($ch);
if ($code == "200") {
echo "200";
} else {
echo "not 200";
}
一些网络服务器的回复速度很慢,并且虽然页面在几秒钟后加载到我的浏览器中我的脚本在尝试连接到该服务器时告诉我它没有收到肯定(“200”)回复。所以,显然,cURL 发起的连接超时了。
但是为什么呢?我没有在我的脚本中设置超时,根据other answers on this site,cURL 的默认超时肯定比页面加载到我的浏览器所需的三四秒长。
那么为什么连接会超时,如果显然它已经设置为无限,我怎样才能让它持续更长时间?
注意事项:
- 相同的 URL 并不总是超时。所以有时 cURL 可以连接。
- 有时超时的不是一个特定的 URL,而是不同时间的不同 URL。
- 我在共享服务器上,所以我没有任何文件的 root 访问权限。
- 我尝试查看
curl_getinfo($ch)和curl_error($ch)- 根据 @drew010 在 cmets 中的建议 - 但每当问题发生时,两者都是空的。 - 整个脚本运行了一分钟多一点。这次它成功连接到 300 多个 URL。即使其中一个 URL 失败,其他连接也会成功建立。所以脚本不会超时。
- cURL 也不会超时,因为当我尝试连接到一个脚本休眠 59 秒的 URL 时,cURL 成功连接。因此,对于 cURL 而言,失败的 URL 的缓慢显然不是问题。
更新
按照@Karlos 在他的回答中的建议,我使用了:
CURLOPT_VERBOSE => 1,
CURLOPT_STDERR => $curl_log
(使用来自 this answer 的代码)并在 URL 失败(URL 和 IP 更改)时在 $curl_log 中找到以下内容:
* About to connect() to www.somesite.com port 80 (#0)
* Trying 104.16.37.249... * connected
* Connected to www.somesite.com (104.16.37.249) port 80 (#0)
GET /wp_german/?feed=rss2 HTTP/1.1
User-Agent: myURL
Host: www.somesite.com
Accept: */*
* Recv failure: Connection reset by peer
* Closing connection #0
所以,我找到了为什么——谢谢@Karlos! – 显然@Axalix 是对的,这是一个网络问题。我现在将遵循此站点上针对此类失败给出的建议。感谢大家的帮助!
【问题讨论】:
-
超时需要多长时间?是连接超时还是套接字超时?
-
@Chris 这是一个连接到大约 300 个 URL 的脚本。它通常在一分钟左右完成。我不知道如何检查它是什么样的超时。
-
您应该转储
curl_getinfo($ch);以查看响应的详细信息。如果响应代码在请求期间从未尝试连接或出现问题(超时除外),则响应代码可能为空。当所有其他方法都失败时,curl_error($ch);也会返回一条错误消息。 -
要找出您应该将时间戳写入日志文件的所有时间。这样,您将能够找出失败请求的超时时间。
-
@what 如果没有模式,那么您可能只是面临网络问题。可能是您的提供商、DNS 等。在不同的网络中尝试相同的代码,看看您是否有同样的问题。