PHP curl"无法解析主机"

时间:2015-09-01 14:05:05

标签: php curl

我要连接到公共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时会发生错误,所以我不认为这可能是问题
  4. 任何想法可能导致这种行为?

    卷曲代码

    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;
    }
    

1 个答案:

答案 0 :(得分:0)

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