• php使用curl模拟多线程发送请求


    每个PHP文件的执行是单线程的,但是php本身也可以用一些别的技术实现多线程并发比如用php-fpm进程,这里用curl模拟多线程发送请求。php的curl多线程是通过不断调用curl_multi_exec来获取内容,这里举一个demo来模拟一次curl多线程并发操作。

    //设置缓冲为0(也可以去php.ini设置)
    ini_set('output_buffering', 0);
    //打开输出缓冲区
    ob_start();
    //设置一个空数组
    $curl_Arr=[];
    //这里模拟20次请求
    for($i=0;$i<20;$i++){
        //开启curl连接
        $curl_Arr[$i]=curl_init("http://XXXX/test.php");
        //CURLOPT_RETURNTRANSFER 设置为1表示稍后执行的curl_exec函数的返回是URL的返回字符串,而不是把返回字符串定向到标准输出并返回TRUE;
        curl_setopt($curl_Arr[$i],CURLOPT_RETURNTRANSFER,1);
    }
    
    //创建批处理cURL句柄
    $mh = curl_multi_init();
    
    foreach($curl_Arr as $k => $ch){
        //curl句柄入栈增加
        curl_multi_add_handle($mh,$ch);
    }
    $active = null;
    while(count($curl_Arr)>0){
        //发起curl_multi请求
        @curl_multi_exec($mh,$active);
        foreach($curl_Arr as $k => $ch){
            //获取句柄的返回值
            if($result[$k]= curl_multi_getcontent($ch)){
                //输出结果
                echo "$result[$k]
    ";
                ob_flush();
                //把被释放的数据发送到浏览器
                flush();
                //关闭该句柄
                curl_multi_remove_handle($mh,$ch);
                unset($curl_Arr[$k]);
            }
        }
    }
    //关闭ouput_buffering机制
    ob_end_flush();
    //关闭"curl_mulit"句柄
    curl_multi_close($mh);

    我再服务器上建立一起请求的php页面命名为test.php,内容如下

    1 sleep(10);
    2 echo 'seccess';exit;

    表示等待十秒后数据下面语句。

    然后我在命令行执行该程序结果如下:

    上面代码中通过循环$curl_Arr数组来调用curl_multi_getcontent来查询是否有数据。有数据就输出并删除元素,直到$curl_Arr数组元素个数为0。

    该模拟多线程实现是通过使用curl的curl_multi系列函数能实现此功能的。至于该系列函数使用介绍,百度一搜一大把。这里就不做说明了。

    本文属原创内容,为了尊重他人劳动,转载请注明本文地址:

    https://www.cnblogs.com/luokakale/p/9900740.html

  • 相关阅读:
    (一)Java基本数据类型及运算符
    (二)Java控制执行流程
    ArrayList类源码解析——ArrayList动态数组的实现细节(基于JDK8)
    Java的四个标记接口:Serializable、Cloneable、RandomAccess和Remote接口
    Java容器类源码分析之Iterator与ListIterator迭代器(基于JDK8)
    Java容器类源码分析前言之集合框架结构(基于JDK8)
    浅谈虚树
    点分治
    Ze_Min Tree 主席树
    笛卡尔树的妙用
  • 原文地址:https://www.cnblogs.com/luokakale/p/9900740.html
Copyright © 2020-2023  润新知