PHP curl_multi_exec 并发请求

使用curl_multi_exec并发请求外部接口

有时候在一个PHP方法中要多次调用外部的接口,为了优化代码,提高效率,我们不妨使用curl_multi_exec并发处理多个请求,这样可以明显地提高获取响应数据的速度,减少程序执行的时间,下面是一个实际运行的例子。

<?php


/**
 * 使用curl并行发送多个请求获取数据
 * @param  array  $urls 多个请求数组
 * @return array
 */
function sendMulti_request(array $urls)
    {
        $conn = [];
        $res = [];
        //创建批处理curl句柄
        $mh = curl_multi_init();

        foreach ($urls as $k => $item) {
            $conn[$k] = curl_init();  //初始化各个子连接
            //设置url和相应的选项
            curl_setopt($conn[$k], CURLOPT_URL, $item['url']);
            curl_setopt($conn[$k], CURLOPT_HEADER, 0);
            curl_setopt($conn[$k], CURLOPT_RETURNTRANSFER, 1); //不直接输出到浏览器,而是返回字符串
            curl_setopt($conn[$k], CURLOPT_TIMEOUT, 10);
            if ($item['method'] == 'post') {
                curl_setopt( $conn[$k], CURLOPT_POST, true );
                $params = $item['params'];
                if (is_array($item['params'])) {
                    $flag = true;
                    foreach ($params as $key => $val) {
                        if (strpos($val, '@') === 0) {
                            $flag = false;
                            break;
                        }
                    }
                    if ($flag) {
                        $params = http_build_query($params);
                    }
                }

                curl_setopt($conn[$k], CURLOPT_POSTFIELDS, $params);
            }
            //处理302跳转
            curl_setopt($conn[$k], CURLOPT_FOLLOWLOCATION, 1);

            //增加句柄
            curl_multi_add_handle($mh, $conn[$k]);   //加入多处理句柄
        }

        $active = 0;     //连接数

        //防卡死写法:执行批处理句柄
        do {
            $mrc = curl_multi_exec($mh, $active);

            //这个循环的目的是尽可能地读写,直到无法继续读写为止
            //返回 CURLM_CALL_MULTI_PERFORM 表示还能继续向网络读写

        } while($mrc == CURLM_CALL_MULTI_PERFORM);

        /*var_dump($mrc);
        echo '<hr/>';
        var_dump($active);die;*/

        while ($active && $mrc == CURLM_OK) {

            if (curl_multi_select($mh) != -1) {
                do {
                    $mrc = curl_multi_exec($mh, $active);

                } while ($mrc == CURLM_CALL_MULTI_PERFORM);
            }
        }

        foreach ($urls as $k => $url) {
            $info = curl_multi_info_read($mh);
            // var_dump($info);

            $headers = curl_getinfo($conn[$k]);
            // var_dump($headers);

            $res[$k] = curl_multi_getcontent($conn[$k]);

            //移除curl批处理句柄资源中的某一个句柄资源
            curl_multi_remove_handle($mh, $conn[$k]);

            //关闭curl会话
            curl_close($conn[$k]);
        }

        //关闭全部句柄
        curl_multi_close($mh);
        return $res;
    }

     //$list是我们组装的请求实体,这个可以自行设置   

    /*定义我们请求的数据和地址*/
    foreach ($list as $k=>$v){
        $parameters[$k]['url'] = $v['url'];
        $parameters[$k]['params'] = $v['param'];
        $parameters[$k]['method'] = 'post';
    }
    $row = sendMulti_request($parameters);

不要着急,是不是发现用不了 主要这个两个地方,1、代码整理完之后要放到服务器上去访问   2、请求的url 也要是公网可以访问的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
curlcurl_multi都是用于进行网络请求的工具。 curl是一个命令行工具,可以通过发送HTTP请求来获取网页内容或发送其他类型的网络请求。它是单线程的,在发送一个请求时会阻塞程序的执行直到请求完成并返回结果。这意味着如果要进行高并发请求,需要启动多个curl进程来同时发送多个请求,但会造成系统资源的浪费。 而curl_multi是一个C语言库,可以实现多个网络请求并发执行。它通过将多个curl实例放入一个集合中,并使用事件循环来处理多个请求的同时执行。这样,在发送一个请求时,程序不会阻塞,而是可以继续执行其他任务,提高了并发处理能力。当所有的请求都完成时,可以一次性获取所有的结果。这种方式减少了系统资源的浪费,提高了程序的效率。 使用curl_multi进行高并发需要注意以下几点: 1. 创建curl_multi实例,并向其中添加需要执行的curl请求。 2. 使用curl_multi_exec函数来开始执行多个请求。 3. 使用curl_multi_select函数等待请求完成。 4. 使用curl_multi_getcontent函数获取每个请求的结果。 需要注意的是,高并发的网络请求对服务器压力较大,也容易出现网络超时等问题,因此需要合理控制并发请求数量,使用适当的技术手段,如连接池、负载均衡等,来保证系统的稳定性和性能。 总之,curlcurl_multi都可以用于高并发的网络请求,但curl_multi具有更好的并发性能和资源利用率,适合在程序中进行大量请求的同时执行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值