【问题标题】:PHP curl "Couldn't resolve host"PHP curl“无法解析主机”
【发布时间】: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。

已经尝试过:

  1. 打开 PHP CURLOPT_VERBOSE 以查看我是否能得到任何有用的信息,但没有运气。
  2. 尝试休眠 (10) - 在此类错误事件发生 15 秒后重新启动请求,但请求与之前一样失败。
  3. 使用 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 如果之前对同一主机的数百个请求正确解析?如果没有事先解决主机问题,那就很清楚了。

标签: php curl


【解决方案1】:

您确定您的脚本不太激进吗?由于传入请求的数量过多,目标主机可能会暂时阻止您(或脚本的主机)。尝试限制你的脚本(像 sleep(1) 这样愚蠢的东西,每个 X 请求都可以工作)。

【讨论】:

  • 好点奥利弗。到目前为止,我从未尝试过降低请求频率。我试一试。但是“无法解析主机”错误是否也适用于远程服务器的可能阻塞行为?
猜你喜欢
  • 2016-04-13
  • 2020-05-01
  • 1970-01-01
  • 2014-09-12
  • 2010-11-23
  • 2011-05-20
  • 2021-12-18
相关资源
最近更新 更多