【发布时间】:2015-09-01 14:05:04
【问题描述】:
我正在连接到公共 API,以便在两个站点之间同步一些内容。 PHP CURL 用于访问 JSON API 和下载二进制图像(为简单起见,下面的代码示例不包括二进制下载!)。
一切正常,直到数百个请求后,我从 curl_error($ch) 得到“无法解析主机”,响应 $body 为空,返回的 $http_code 为 0。 curl 返回空响应,直到脚本完成工作。网址绝对正确。
系统
脚本在 Debian Linux 6.0 机器上运行,使用 PHP 5.3.3-7+squeeze26。
已经尝试过:
- 打开 PHP CURLOPT_VERBOSE 以查看我是否能得到任何有用的信息,但没有运气。
- 尝试休眠 (10) - 在此类错误事件发生 15 秒后重新启动请求,但请求与之前一样失败。
- 使用 memory_get_usage() 测量内存消耗。该脚本有 2GB 内存限制,当内存消耗大约 150M 时会发生错误,所以我认为这不是问题
任何想法可能导致这种行为?
卷曲代码
function getData($url, $countRetries = 0) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_STDERR, $log_stderr = fopen('/var/log/curl.log', 'a'));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));
$response = curl_exec($ch);
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
fclose($log_stderr);
if ($http_code == 0 && $countRetries < 3) {
sleep(10);
return getData($data, $countRetries);
}
return $body;
}
【问题讨论】:
-
网址中的主机名,例如
example.com无法由主机运行脚本解析。这不是我们可以帮助您的事情。你需要调试它。例如做一个nslookup example.com看看是否会回来。 -
Couldn't resolve host主机无法访问时发生错误,检查您的dns或尝试将您的dns 更改为google's (8.8.8.8)服务器 -
感谢您的提示。只是检查:dns 是否可能无法解析,例如example.com 如果之前对同一主机的数百个请求正确解析?如果没有事先解决主机问题,那就很清楚了。