php使用curl模拟多线程发送请求的代码示例

来源:转载 发布时间:2018-11-21 11:45:36 阅读量:644

本篇文章给大家带来的内容是关于php使用curl模拟多线程发送请求的代码示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

//设置缓冲为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]\n";

            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

2

1 sleep(10);

2 echo 'seccess';exit;

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

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

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

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


标签: PHP
分享:
评论:
你还没有登录,请先