当前位置:首页 > 编程技术 > PHP编程 > 正文内容

PHP 多线程 curl_multi_init 的使用 PK curl_init 看看那个更快

曾经2个月前 (05-08)PHP编程1708

php中可以通过CURL处理HTTP请求,其中curl_init()是单线程模式,如果需要对事务处理走多线程模式,那么就需要用到curl_multi_init()函数。

本案例用来测试大并发的情况下 curl_multi_init() 到底比 curl_init() 快多少。

话不多少,直接上代码:

<?php
class Http
{
    /**
     * https 发起post请求
     * @param string $url url信息
     * @param mixed $data 参数信息[$data = '{"a":1,"b":2}' or $data = array("a" => 1,"b" => 2)]
     * @param int $timeOut 超时设置
     * @param string $proxyHost 代理host
     * @param int $proxyPort 代理端口
     * @return string
     */
    public static function post($url, $data = null, $timeOut = 20, $proxyHost = null, $proxyPort = null)
    {
        try {
            if (strlen($url) < 1) {
                return null;
            }

            $ch = curl_init();
            // 设置url
            curl_setopt($ch, CURLOPT_URL, $url);
            if (false == empty($data)) {
                curl_setopt($ch, CURLOPT_POST, 1);
                if (is_array($data) && count($data) > 0) {
                    curl_setopt($ch, CURLOPT_POST, count($data));
                }
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            }
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

            // 如果成功只将结果返回,不自动输出返回的内容
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            // user-agent
            curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0");
            // 超时
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeOut);

            // 使用代理
            if (strlen($proxyHost) > 0 && strlen($proxyPort) > 0) {
                // 代理认证模式
                curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC);
                // 代理服务器地址
                curl_setopt($ch, CURLOPT_PROXY, $proxyHost);
                // 代理服务器端口
                curl_setopt($ch, CURLOPT_PROXYPORT, $proxyPort);
                // 使用http代理模式
                curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
            }

            // 执行
            $out = curl_exec($ch);
            // 关闭
            curl_close($ch);
            return $out;
        } catch (Exception $e) {
            return null;
        }

    }

    /**
     * https 发起post多发请求
     * @param array $nodes url和参数信息。
     * $nodes = [
     * [0] = > [
     * 'url' => 'http://www.baidu.com',
     * 'data' => '{"a":1,"b":2}'
     * ],
     * [1] = > [
     * 'url' => 'http://www.baidu.com',
     * 'data' => null
     * ]
     * ....
     * ];
     * @param int $timeOut 超时设置
     * @return array
     */
    public static function postMulti($nodes, $timeOut = 5)
    {
        try {
            if (false == is_array($nodes)) {
                return array();
            }

            $mh = curl_multi_init();
            $curlArray = array();
            foreach ($nodes as $key => $info) {
                if (false == is_array($info)) {
                    continue;
                }
                if (false == isset($info['url'])) {
                    continue;
                }

                $ch = curl_init();
                // 设置url
                $url = $info['url'];
                curl_setopt($ch, CURLOPT_URL, $url);

                $data = isset($info['data']) ? $info['data'] : null;
                if (false == empty($data)) {
                    curl_setopt($ch, CURLOPT_POST, 1);
                    // array
                    if (is_array($data) && count($data) > 0) {
                        curl_setopt($ch, CURLOPT_POST, count($data));
                    }
                    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                }

                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
                // 如果成功只将结果返回,不自动输出返回的内容
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                // user-agent
                curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0");
                // 超时
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeOut);

                $curlArray[$key] = $ch;
                curl_multi_add_handle($mh, $curlArray[$key]);
            }

            $running = NULL;
            do {
                usleep(10000);
                curl_multi_exec($mh, $running);
            } while ($running > 0);

            $res = array();
            foreach ($nodes as $key => $info) {
                $res[$key] = curl_multi_getcontent($curlArray[$key]);
            }
            foreach ($nodes as $key => $info) {
                curl_multi_remove_handle($mh, $curlArray[$key]);
            }
            curl_multi_close($mh);
            return $res;
        } catch (Exception $e) {
            return array();
        }

    }

}

$count = 10;

//2.1 循环调用Http::post() 100次
$url = 'https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=abcdasdfasdfasdfasdfasdfasdfasdfasdfasdf';
$startTime = microtime(true);
for ($i = 1; $i <= $count; $i++) {
    $res = Http::post($url);
}
$endTime = microtime(true);

echo $endTime - $startTime;
echo "\n";

//2.2 调用Http::postMulti()一次发100个url
$url = 'https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=abcdasdfasdfasdfasdfasdfasdfasdfasdfasdf';
$nodes = array();
for ($i = 1; $i <= $count; $i++) {
    $info = array();
    $info['url'] = $url;
    $nodes[] = $info;
}

$startTime = microtime(true);
$res = Http::postMulti($nodes);
$endTime = microtime(true);

echo $endTime - $startTime;
echo "\n";

?>

运行结果:

* 当$count=10的情况下,耗时分别为:

3.41195106506350.44486904144287

curl_multi_init() 比 curl_init() 快了8倍。

* 当 $count=100的情况下,耗时分别为:

34.1900150775911.9350771903992

curl_multi_init() 比 curl_init() 快了17倍。


扫描二维码推送至手机访问。

版权声明:本文由珍惜发布,如需转载请注明出处。

本文链接:https://www.zp68.com/article/63.html

分享给朋友:
返回列表

上一篇:php 使用curl_multi_init批量请求

没有最新的文章了...

“PHP 多线程 curl_multi_init 的使用 PK curl_init 看看那个更快” 的相关文章

PHP多数组组合-颜色尺码大小

抽象一下需求:在构建某个对象时,它拥有多个属性,每个属性拥有多个可选的值,需要穷举出每个属性不同的选择组合构建出的不同对象,比如:输入参数:$arr = [     'Name' => ['...

php实现边执行边输出的效果

客户端的请求到web服务器,web服务器再调用PHP代码;PHP返回内容到web服务器,web服务器再返回给客户端边执行边输出就需要web服务器和PHP都不缓存内容首先, Nginx不缓存PHP返回的内容header('X-Accel-Buffering: no'...

最详细的PHP flush()与ob_flush()的区别详解

buffer ---- flush()buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的 设备之间传办理数据的区域。通过buffer,可以使进程这间的相互等待变少。这里说一个通俗一点的例子,你打开文本编辑器编辑一...

PHP中刷新输出缓冲

PHP中刷新输出缓冲buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的 设备之间传办理数据的区域。通过buffer,可以使进程这间的相互等待变少。这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每...

php 使用curl_multi_init批量请求

抓取多个URL地址是Web开发中常见的需求,使用PHP的curl库可以简化这个过程。本文将详细介绍如何使用PHP的curl库同时请求多个URL地址,并提供具体的代码案例和注释。curl库介绍curl是一个常用的开源网络传输工具,可以通过各种协议(如HTTP、FTP、TELNET)在不同的平台上进行数...

评论列表

游客
1周前 (07-10)

视死如归的架势啊!http://lsfo.dpgljks.cn

游客
1周前 (07-11)

雷锋做好事不留名,都写在帖子里!http://kjvam.nbqywh.com

游客
1周前 (07-11)

楼主是好人!http://www.gxmlm.com

游客
1周前 (07-11)

视死如归的架势啊!http://www.ddman.net

游客
1周前 (07-11)

楼主人气很旺!http://gbl0.fulihua0415.com

游客
1周前 (07-11)

收藏了,以后可能会用到!http://1brnp.xmyw.net

游客
1周前 (07-11)

十分赞同楼主!http://d43u1f.fsxjlw.com

游客
1周前 (07-11)

楼主是男的还是女的?http://g6qe.fsxjlw.com

游客
1周前 (07-11)

这么好的帖子,应该加精华!http://moy8j.souf1.com

游客
1周前 (07-11)

很给力!http://okpatv.schtwl.com

游客
1周前 (07-11)

吹牛的人越来越多了!http://myfba.schtwl.com

游客
1周前 (07-11)

顶!顶!顶!http://ynp.gdlydzkj.cn

游客
1周前 (07-11)

网页的加载速度非常快,不会影响用户体验。http://0rm6z.21asp.com

游客
1周前 (07-11)

内容很有深度!http://hoj83j.zhoutan.net

游客
7天前

祖国尚未统一,我却天天灌水,好内疚!http://ufyxc.hemoart.com

游客
7天前

楼主你想太多了!http://mxky0.aficsol.com/5/4.html

游客
7天前

回帖也有有水平的!http://xwgby.hooby.cn

游客
7天前

感觉不错!http://ig39m1.nonauxsubventions.com

游客
7天前

灌水不是我的目的!http://vxy727.ymyzncp.com

游客
7天前

看了这么多帖子,第一次看到这么有深度了!http://6sdmh.tike-tec.cn

访客
7天前

安福相册精准查找https://ccc444.com

游客
7天前

楼主你想太多了!http://y9c.sxscwo.com

游客
7天前

强,我和我的小伙伴们都惊呆了!http://1wacm.nbqywh.com

游客
7天前

楼主就是我的榜样哦http://v9wzi.lkjk.cn

游客
7天前

听楼主一席话,省我十本书!http://lrf.schhzsjt.com

游客
7天前

投楼主一票,不用谢哦!http://p9ved8.sy-cl.com

游客
7天前

看帖不回帖的人就是耍流氓,我回复了!http://aze.dreamlalinen.com

游客
7天前

小弟默默的路过贵宝地~~~http://hjmqla.51ysh.com

游客
7天前

看帖不回帖的人就是耍流氓,我回复了!http://2j808.51ysh.com

游客
7天前

好帖子!http://khedj.dreamlalinen.com

游客
7天前

今天怎么了,什么人都出来了!http://k40c8.xmyw.net

游客
7天前

态度决定一切,不错!http://l7c7.jxkspx.com

游客
7天前

收藏了,怕楼主删了!http://54en.aochengyy.com

游客
7天前

看了这么多帖子,第一次看到这么高质量内容!http://t38zno.dzc60.com

游客
7天前

我就搞不明白了,看帖回帖能死人么,居然只有我这么认真的在回帖!http://8ljxj.whjttm.cn

游客
7天前

观点鲜明,立场坚定,作者态度明确。http://4cav4.yh388006.com/6/4.html

游客
7天前

收藏了,楼主加油!http://cxnc.ads898.com

游客
6天前

不错的帖子,值得收藏!http://4yqs0w.cityxz.cn

游客
6天前

今天是个特别的日子,值得纪念!http://u3a4.lkjk.cn

游客
6天前

看帖不回帖都是耍流氓!http://b85r.shagnqiuw.com

游客
6天前

支持楼上的!http://6mg.lkjk.cn

游客
6天前

谢谢楼主的分享!http://5a72g.anchaozs.cn

游客
6天前

看帖、回帖、拿分、走人http://36jn.21ddos.com

游客
6天前

这个帖子会火的,鉴定完毕!http://h7tp3.jiahe3d.com/20240712/3.html

游客
6天前

顶!顶!顶!http://y02a3.522128.com/1/3.html

游客
6天前

楼主内心很强大!http://rjf.lazarzanyc.com

游客
6天前

帖子好乱!http://x87z44.rp233.com

游客
6天前

终于看完了,很不错!http://jvz.lkjk.cn

游客
6天前

坚持回帖!http://5q**li.aoanfc.com

访客
6天前

安福相册精准查找 https://z11.cn

游客
6天前

这里的资源非常丰富,帮助我解决了很多问题。http://oowod.wms1688.com/07/3.html

游客
6天前

今天的心情很不错啊http://70d.tjsbbz.com

游客
6天前

林子大了,什么鸟都有了啊!http://128ns.lkjk.cn

游客
6天前

态度决定一切,不错!http://owu2h.bzjhfzzhzs.com/20240712/3.html

游客
6天前

收藏了,楼主加油!http://hzf0ba.lkjk.cn

游客
6天前

信楼主,考试不挂科!http://uefd.boyidachem.com

游客
6天前

顶一个!http://yv1s4.308520.com

游客
5天前

在哪里跌倒,就在那里多爬一会儿!http://ixrfu.519ly55.com

游客
5天前

东方不败还是灭绝师太啊?http://lgctg.yeyou9.com/9/3.html

游客
5天前

观点鲜明,立场坚定,作者态度明确。http://aviw8.gzhkzyxy.com

游客
5天前

今天是个特别的日子,值得纪念!http://sg2z1.sjzxyc.com/2024/3.html

游客
5天前

最近回了很多帖子,都没人理我!http://www.kdhlpt.com/yaowen/387607690.html

游客
5天前

东方不败外加灭绝师太啊!http://www.kdhlpt.com/yaowen/044174260.html

安福相册
5天前

莆田鞋官网 https://www.anfu0594.com

游客
5天前

太高深了,理解力不够用了!http://www.kdhlpt.com/yaowen/263522763.html

游客
5天前

好好学习楼主的帖子!http://763d.lkjk.cn

游客
5天前

灌水不是我的目的!http://www.kdhlpt.com/yaowen/023361399.html

游客
5天前

经典,收藏了!http://iclx.ynport.net/test/932821841.html

游客
5天前

论坛人气好旺!http://dyas.ynport.net/test/937034623.html

游客
5天前

最近回了很多帖子,都没人理我!http://rdli.ynport.net/test/932771815.html

游客
5天前

不是惊喜,是惊吓!http://pmux.ynport.net/test/258375090.html

游客
5天前

怎么我回帖都没人理我呢?http://wjzj.ynport.net/test/856720095.html

游客
5天前

十分赞同楼主!http://mjhw.ynport.net/test/884819129.html

游客
5天前

感谢楼主的推荐!http://vsyv.ynport.net/test/790977514.html

游客
5天前

这里的资源非常丰富,帮助我解决了很多问题。http://tjtr.ynport.net/test/161951586.html

游客
5天前

楼主练了葵花宝典吧?http://aqdc.ynport.net/test/797241079.html

游客
5天前

鸟大了,什么林子都敢进啊!http://xque.ynport.net/test/668825914.html

游客
5天前

楼主是在找骂么?http://j5ck.qqw16.com

游客
5天前

好帖子!http://w07v.lkjk.cn

游客
5天前

收藏了,以后可能会用到!http://jewc.jnqxbjgs.com

游客
5天前

楼主好聪明啊!http://orjt.ynport.net/test/521591578.html

游客
5天前

回帖也有有水平的!http://sgda.ynport.net/test/883988890.html

游客
5天前

很有看点!http://vuvd.ynport.net/test/701430603.html

游客
5天前

收藏了,很不错的内容!http://zbyw.ynport.net/test/049797555.html

游客
5天前

我裤子脱了,纸都准备好了,你就给我看这个?http://sxdd.ynport.net/test/630645558.html

游客
5天前

楼上的这是啥态度呢?http://tpgl.ynport.net/test/574910752.html

安福相册
5天前

安福货源网 https://www.anfu0594.com

游客
5天前

雷锋做好事不留名,都写在帖子里!http://ieieu.shenguizuofang.com/H/5.html

游客
5天前

吹牛的人越来越多了!http://ht0zp.818cheng.com/b/4.html

游客
5天前

内容很有深度!http://kbla.ynport.net/test/238374855.html

游客
5天前

不错哦,楼主这是要火的节奏啊!http://dkap.ynport.net/test/029043542.html

游客
5天前

东方不败外加灭绝师太啊!http://bnbmv.lkjk.cn

游客
5天前

看了这么多帖子,第一次看到这么经典的!http://rfpd.ynport.net/test/837873632.html

游客
5天前

雷锋做好事不留名,都写在帖子里!http://rcqc.ynport.net/test/035490198.html

游客
5天前

看了这么多帖子,第一次看到这么高质量内容!http://eyns.ynport.net/test/865615325.html

游客
5天前

信楼主,得永生!http://seno.ynport.net/test/811674313.html

游客
5天前

我只是来赚积分的!http://9moo2.jinyaod.com

游客
5天前

这么好的帖子,应该加精华!http://wkpl.ynport.net/test/579278182.html

游客
5天前

信楼主,得永生!http://rbqoi.cqhjkqyiy.com/20240712/4.html

游客
5天前

好东西,赞一个!http://www.hntbhz.cn/post/49.html

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。