浅谈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]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 sleep(10);  2 echo 'seccess';exit;

表示等待十秒后数据下面语句。
然后我在命令行执行该程序结果如下:

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

上面代码中通过循环$curl_Arr数组来调用curl_multi_getcontent来查询是否有数据。有数据就输出并删除元素,直到$curl_Arr数组元素个数为0。
该模拟多线程实现是通过使用curl的curl_multi系列函数能实现此功能的。至于该系列函数使用介绍,百度一搜一大把。这里就不做说明了。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论