专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »PHP教程 » phpcurl:PHP中的curl_multi一族函数 »正文

phpcurl:PHP中的curl_multi一族函数

来源: 发布时间:星期四, 2009年2月12日 浏览:88次 评论:0


    相信许多人对php手册中语焉不详curl_multi头疼不已它们文档少例子 更是简单让你无从借鉴我也曾经找了许多网页都没见个完整应用例子
curl_multi_add_handle 
curl_multi_close 
curl_multi_exec 
curl_multi_getcontent 
curl_multi_info_read 
curl_multi_init 
curl_multi_remove_handle 
curl_multi_select 
般来说想到要用这些显然应该是要同时请求多个url而不是个依次请求否则不如自己循环去调curl_exec好了
步骤整理总结如下:
步:curl_multi_init
第 2步:循环curl_multi_add_handle
步需要注意curl_multi_add_handle第 2个参数是由curl_init而来子handle
第 3步:持续curl_multi_exec
第 4步:根据需要循环curl_multi_getcontent获取结果
第 5步:curl_multi_remove_handle并为每个字handlecurl_close
第 6步:curl_multi_close
这里有个网上找简单例子其作者称为dirty例子(稍后我会介绍说明为何dirty):
/*
Here’s a quick and dirty example for curl-multi from PHP, tested on PHP 5.0.0RC1 CLI / FreeBSD 5.2.1
*/

$connos = .gif' />(
\"http://www.cnn.com/\",
\"http://www.canada.com/\",
\"http://www.yahoo.com/\"
);

$mh = curl_multi_init;

foreach ($connos as $i => $url) {
     $conn[$i]=curl_init($url);
      curl_opt($conn[$i],CURLOPT_RETURNTRANSFER,1);
      curl_multi_add_handle ($mh,$conn[$i]);
}

do { $n=curl_multi_exec($mh,$active); } while ($active);

foreach ($connos as $i => $url) {
      $res[$i]=curl_multi_getcontent($conn[$i]);
      curl_close($conn[$i]);
}

pr_r($res);
 
整个使用过程差不多就是这样但是这个简单代码有个致命弱点就是在do循环那段在整个url请求期间是个死循环它会轻易导致CPU占用100%
现在我们来改进它这里要用到个几乎没有任何文档curl_multi_select了虽然Ccurl库对select有介绍说明但是php里接口和使用方法确和C中有区别
把上面do那段改成下面这样:
                do {
                        $mrc = curl_multi_exec($mh,$active);
                } while ($mrc  CURLM_CALL_MULTI_PERFORM);
                while ($active and $mrc  CURLM_OK) { [Page]
                         (curl_multi_select($mh) != -1) {
                                do {
                                        $mrc = curl_multi_exec($mh, $active);
                                } while ($mrc  CURLM_CALL_MULTI_PERFORM);
                        }
                }
$active要等全部url数据接受完毕才变成false所以这里用到了curl_multi_exec返回值判断是否还有数据当有数据时候就不停curl_multi_exec暂时没有数据就进入select阶段新数据来就可以被唤醒继续执行这里好处就是CPU无谓消耗没有了
另外:还有些细节地方可能有时候要遇到:
控制每个请求超时时间在curl_multi_add_handle的前通过curl_opt去做:
curl_opt($ch, CURLOPT_TIMEOUT, $timeout);
判断是否超时了或者其他在curl_multi_getcontent的前用:curl_error($conn[$i]);
标签:phpcurl
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: