加入收藏 | 设为首页 | 会员中心 | 我要投稿 天瑞地安资讯网_保定站长网 (https://www.52baoding.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

浅谈php利用curl模拟多线程发送哀求

发布时间:2022-09-14 15:24:01 所属栏目:PHP教程 来源:
导读:  每个PHP文件的实行是单线程的,但是php自己也可以用一些别的技能实现多线程并发好比用php-fpm进程,这里用curl模拟多线程发送请求。php的curl多线程是通过不停调用curl_multi_exec来获取内容,这里举一个demo来模
  每个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;
  复制代码
  表示等待十秒后数据下面语句。
 
  然后我在下令行实行该程序结果如下:
 
  上面代码中通过循环$curl_Arr数组来调用curl_multi_getcontent来查询是否有数据。有数据就输出并删除元素,直到$curl_Arr数组元素个数为0。
 
  该模拟多线程实现是通过利用curl的curl_multi系列函数能实现此功能的。至于该系列函数利用介绍,百度一搜一大把。这里就不做阐明了。
  
 

(编辑:天瑞地安资讯网_保定站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!