猿问

在一百万循环中使用curl,出现transfer closed with ocsding read data remaining

业务大概是这样:一百万数据,循环一百万的数据,在循环的时候调用curl。

代码:

// 开始循环一百万的数据
foreach($data as $value){
    // 调用curl
    tocurl($url, $header, $value);
}
// curl函数
function tocurl($url, $header, $content){
    $ch = curl_init();
    if(substr($url,0,5)=='https'){
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);  // 从证书中检查SSL加密算法是否存在
    }
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    if($content) {
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $content);
    }
    $response = curl_exec($ch);
    if($error=curl_error($ch)){
        die($error);
    }
    curl_close($ch);
    return $response;
}

尝试:

1. 开始没有设置 CURLOPT_TIMEOUT 和 CURLOPT_CONNECTTIMEOUT,然后设置为:
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
然而还是出现 transfer closed with ocsding read data remaining 这个问题
2. 通过 stack overflow 搜索找到一个方法,回答是这样的:缺少 Content-Length 这个 header,
然后设置 POST 的数据 json_encode 通过 strlen() 计算其字数,然后设置 Content-lenth,
在去尝试运行,还是出现 transfer closed with ocsding read data remaining 这个问题
3. 后面以为是数据量太大,把这一百万数据准备分成了十个线程去跑,在测试跑一个线程(10万数据)的时候也出现了 transfer closed with ocsding read data remaining 这个问题,看起来像是curl的问题。

php的版本是5.3,这个问题如何解决?还有谢谢各位的回答。

万千封印
浏览 617回答 2
2回答

MMMHUHU

为何不用 curl_multi_init
随时随地看视频慕课网APP
我要回答