中国设计秀欢迎投稿
中国设计秀设计资源站
平面设计 画册 VI欣赏 包装 CG-插画 搜索 个人网页 Alexa排名 CSS 建站资源 下载专区 JS特效 品牌服装 服装院校 专题欣赏 SEO 图标欣赏 专题
广州网站设计 维美网站建设 域名注册 虚拟主机 广州网站建设 广州网页设计 虚拟主机 域名注册 素材下载 广告服务 中国品牌形象设计 网站推广 家具中国
求创科技
中国设计秀
中国福网
金视觉
中国设计秀欢迎你
中国品牌形象设计网
中国设计秀
当前位置:网络学院首页 >> 编程开发 >> php >> PHP中的curl_multi一族函数

PHP中的curl_multi一族函数 (1)

来源:中国设计秀    作者:    点击:163     加入收藏    发表评论
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
第二步:循环调用curl_multi_add_handle
这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle。
第三步:持续调用curl_multi_exec
第四步:根据需要循环调用curl_multi_getcontent获取结果
第五步:调用curl_multi_remove_handle,并为每个字handle调用curl_close
第六步:调用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
*/

 $connomains = array(
"http://www.cnn.com/",
"http://www.canada.com/",
"http://www.yahoo.com/"
);

 $mh = curl_multi_init();

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

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

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

print_r( $res);

整个使用过程差不多就是这样,但是,这个简单代码有个致命弱点,就是在do循环的那段,在整个url请求期间是个死循环,它会轻易导致CPU占用100%。
现在我们来改进它,这里要用到一个几乎没有任何文档的函数curl_multi_select了,虽然C的curl库对select有说明,但是,php里的接口和用法确与C中有不同。
把上面do的那段改成下面这样:
                do {
                         $mrc = curl_multi_exec( $mh, $active);
                } while ( $mrc == CURLM_CALL_MULTI_PERFORM);
                while ( $active and  $mrc == CURLM_OK) {      if (curl_multi_select( $mh) != -1) {
                                do {
                                         $mrc = curl_multi_exec( $mh,  $active);
                                } while ( $mrc == CURLM_CALL_MULTI_PERFORM);
                        }
                }
因为 $active要等全部url数据接受完毕才变成false,所以这里用到了

[1] [2]
2007-10-15 16:24:00    出处:
热点文章/相关文章
关于我们 | 联系我们 | 网站建设 | 广告服务 | 版权声明 | 免责声明 | 网站公告 | 友情链接 | 留言 | 旧版入口