curl模拟多线程抓取网页(优化)

  通过上篇文章清楚了通过curl_multi_*函数可以一次请求多个url,但是也留下了问题,就是结果要等所有数据请求结束一起返回,才能逐个处理数据。优化代码,使先成功请求的url先返回处理结果,而不是等着所有一起返回。

  注意:这里相对于上一篇文章的模型,总体请求时间并不会太大改变,也许还会变慢(某个请求成功后返回处理数据耗时)。

//修改后的模型
do {
    while (($execrun = curl_multi_exec($mh, $running)) == CURLM_CALL_MULTI_PERFORM) ;

    //CURLM_OK只是意味着数据传送完毕或者没有数据 可传送
    if ($execrun != CURLM_OK)
        break;

    //curl_multi_info_read 查询批处理句柄是否单独的传输线程中有消息或信息返回。
    while ($done = curl_multi_info_read($mh)) {

        $info = curl_getinfo($done['handle']);
        $tmp_result = curl_multi_getcontent($done['handle']);
        $error = curl_error($done['handle']);
        curl_multi_remove_handle($mh, $done['handle']);
        var_dump($tmp_result);
        //可以观察到,只要有url请求成功,就会把数据返回生成文件。
        file_put_contents('curl_multi2.log',$tmp_result."



",FILE_APPEND);
    }

    
    if ($running)
        curl_multi_select($mh);

} while ($running);

  运行php脚本,很快就会看见 .log文件生成并且有对应数据,而不是整个请求结束才生成完整的log。

  参考:http://my.oschina.net/u/586648/blog/184020

原文地址:https://www.cnblogs.com/loveyouyou616/p/5624184.html