PHP使用curl_multi实现并发请求的方法示例
发布:smiling 来源: PHP粉丝网 添加日期:2021-09-15 10:47:47 浏览: 评论:0
这篇文章主要介绍了PHP使用curl_multi实现并发请求的方法,结合实例形式分析了php封装curl_multi实现的并发请求相关操作技巧,需要的朋友可以参考下。
本文实例讲述了PHP使用curl_multi实现并发请求的方法,分享给大家供大家参考,具体如下:
- class CurlMultiUtil {
- /**
- * 根据url,postData获取curl请求对象,这个比较简单,可以看官方文档
- */
- private static function getCurlObject($url,$postData=array(),$header=array()){
- $options = array();
- $url = trim($url);
- $options[CURLOPT_URL] = $url;
- $options[CURLOPT_TIMEOUT] = 3;
- $options[CURLOPT_RETURNTRANSFER] = true;
- foreach($header as $key=>$value){
- $options[$key] =$value;
- }
- if(!emptyempty($postData) && is_array($postData)){
- $options[CURLOPT_POST] = true;
- $options[CURLOPT_POSTFIELDS] = http_build_query($postData);
- }
- if(stripos($url,'https') === 0){
- $options[CURLOPT_SSL_VERIFYPEER] = false;
- }
- $ch = curl_init();
- curl_setopt_array($ch,$options);
- return $ch;
- }
- /**
- * [request description]
- * @param [type] $chList
- * @return [type]
- */
- private static function request($chList){
- $downloader = curl_multi_init();
- // 将三个待请求对象放入下载器中
- foreach ($chList as $ch){
- curl_multi_add_handle($downloader,$ch);
- }
- $res = array();
- // 轮询
- do {
- while (($execrun = curl_multi_exec($downloader, $running)) == CURLM_CALL_MULTI_PERFORM);
- if ($execrun != CURLM_OK) {
- break;
- }
- // 一旦有一个请求完成,找出来,处理,因为curl底层是select,所以最大受限于1024
- while ($done = curl_multi_info_read($downloader)){
- // 从请求中获取信息、内容、错误
- // $info = curl_getinfo($done['handle']);
- $output = curl_multi_getcontent($done['handle']);
- // $error = curl_error($done['handle']);
- $res[] = $output;
- // 把请求已经完成了得 curl handle 删除
- curl_multi_remove_handle($downloader, $done['handle']);
- }
- // 当没有数据的时候进行堵塞,把 CPU 使用权交出来,避免上面 do 死循环空跑数据导致 CPU 100%
- if ($running) {
- $rel = curl_multi_select($downloader, 1);
- if($rel == -1){
- usleep(1000);
- }
- }
- if($running == false){
- break;
- }
- }while(true);
- curl_multi_close($downloader);
- return $res;
- }
- /**
- * [get description]
- * @param [type] $urlArr
- * @return [type]
- */
- public static function get($urlArr){
- $data = array();
- if (!emptyempty($urlArr)) {
- $chList = array();
- foreach ($urlArr as $key => $url) {
- $chList[] = self::getCurlObject($url);
- }
- $data = self::request($chList);
- }
- return $data;
- }
- }
Tags: curl_multi PHP并发请求
- 上一篇:PHP实现转盘抽奖算法分享
- 下一篇:PHP实现通过strace定位故障原因的方法
相关文章
- ·解决php curl_multi批处理造成CPU负载过高问题 (2014-08-27)
- ·php curl_multi 多线程查询的例子(2018-09-16)
- ·PHP使用curl_multi_select解决curl_multi网页假死问题的方法(2021-10-23)
- ·php使用curl_init()和curl_multi_init()多线程的速度比较详解(2021-10-25)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)