资讯专栏INFORMATION COLUMN

PHP使用curl_multi并发请求

Jacendfeng / 1446人阅读

摘要:根据获取请求对象这个比较简单可以看官方文档将三个待请求对象放入下载器中轮询一旦有一个请求完成,找出来,处理因为底层是,所以最大受限于从请求中获取信息内容错误把请求已经完成了得删除当没有数据的时候进行堵塞,把使用权交出来,避免上面死循环空跑数

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(!empty($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 (!empty($urlArr)) {
            $chList = array();
            foreach ($urlArr as $key => $url) {
                $chList[] = self::getCurlObject($url);
            }
            $data = self::request($chList);
        }
        return $data;
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22085.html

相关文章

  • curl_multi实现并发

    摘要:普通请求创建多个资源并发创建多个资源创建批处理句柄增加句柄待优化点在执行而整个批处理句柄没有全部执行完毕时,系统会不停地执行函数。进行改动的方式是应用函数库中的函数,其函数原型如下阻塞直到批处理连接中有活动连接。 普通请求 curl_normal.php use time:0.830 s curl_multi并发 curl_multi.php use time:0.259 s ...

    shusen 评论0 收藏0
  • PHP实现并发请求

    摘要:不支持多线程模式和回调处理,因此内部脚本都是同步阻塞式的,如果你发起一个的请求,那么程序就会阻塞,直到请求返回结果,才会继续执行代码。参考资料手册手册预定义常量中实现多线程请求详解每次使用同时并发多少请求合适简书多线程及原理 后端服务开发中经常会有并发请求的需求,比如你需要获取10家供应商的带宽数据(每个都提供不同的url),然后返回一个整合后的数据,你会怎么做呢? 在PHP中,最直观...

    zhangfaliang 评论0 收藏0
  • phpcurl_multi函数集的用法

    摘要:今天我就来聊聊我关于函数集的使用心得,关于请求的问题。耗时这是不能容忍的。事实上内部实现就是用的事件循环。通过函数创建下载器。四复杂的运用这就是用法在上面的例子中。动态的从下载器中取出已经完成了的请求。函数实现的压测工具。 一、引言 这段时间比较忙,已经很久没有写博客了。今天我就来聊聊我关于curl_multi_*函数集的使用心得,关于http请求的问题。 当我们用户php发起一个ht...

    neu 评论0 收藏0
  • 三年前旧代码的重构、总结与反思

    摘要:最近在维护一个三年前的旧代码,用的是框架。单元测试和语言并发控制实际上是个蛋疼的问题,夸张一点说,当时的并不能特别轻松地实现并发,甚至不能实现并发。语言的功能之一就是自带单元测试。用语言之前,我的习惯是不写单元测试。 最近在维护一个三年前的旧代码,用的是laravel框架。 从某些方面来讲,这个代码算是比较标准为了实现在规定的时间内完成相关功能,同时程序员水平不高、经过大量优化之后,变...

    Shihira 评论0 收藏0
  • PHP编程中的并发

    摘要:编程中的并发周末去北京面了两个公司,认识了几位技术牛人,面试中聊了很多,感觉收获颇丰。本文大约总结了编程中的五种并发方式,最后的的实现纯属无聊,可以无视。生成的可以中断函数,并用向发送消息。 PHP编程中的并发 周末去北京面了两个公司,认识了几位技术牛人,面试中聊了很多,感觉收获颇丰。认识到了自己的不足之处,也坚定了自己对计算机学习的信心。本文是对其中一道面试题的总结。 面试中有一个问...

    lewinlee 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<