每个PHP文件的执行是单线程的,但是php本身也可以用一些别的技术实现多线程并发比如用php-fpm进程,这里用curl模拟多线程发送请求。php的curl多线程是通过不断调用curl_multi_exec来获取内容,这里举一个demo来模拟一次curl多线程并发操作。
1 /** 2 * Subject:php模拟多线程请求curl返回结果 3 * User: luokakale 4 * Date: 2018/11/3 5 * Time: 11:14 6 */ 7 8 //设置缓冲为0(也可以去php.ini设置) 9 ini_set(‘output_buffering‘, 0); 10 //打开输出缓冲区 11 ob_start(); 12 //设置一个空数组 13 $curl_Arr=[]; 14 //这里模拟20次请求 15 for($i=0;$i<20;$i++){ 16 //开启curl连接 17 $curl_Arr[$i]=curl_init("http://XXXX/test.php"); 18 //CURLOPT_RETURNTRANSFER 设置为1表示稍后执行的curl_exec函数的返回是URL的返回字符串,而不是把返回字符串定向到标准输出并返回TRUE; 19 curl_setopt($chArr[$i],CURLOPT_RETURNTRANSFER,1); 20 } 21 22 //创建批处理cURL句柄 23 $mh = curl_multi_init(); 24 25 foreach($curl_Arr as $k => $ch){ 26 //curl句柄入栈增加 27 curl_multi_add_handle($mh,$ch); 28 } 29 30 $active = null; 31 32 while(count($curl_Arr)>0){ 33 //发起curl_multi请求 34 @curl_multi_exec($mh,$active); 35 foreach($curl_Arr as $k => $ch){ 36 //启动多线程 37 if($result[$k]= curl_multi_getcontent($ch)){ 38 //输出结果 39 echo "$result[$k]\n"; 40 ob_flush(); 41 //把被释放的数据发送到浏览器 42 flush(); 43 //关闭改句柄 44 curl_multi_remove_handle($mh,$ch); 45 unset($curl_Arr[$k]); 46 } 47 } 48 } 49 //关闭ouput_buffering机制 50 ob_end_flush(); 51 //关闭"curl_mulit"句柄 52 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
原文地址:https://www.cnblogs.com/luokakale/p/9900740.html
时间: 2024-11-01 23:52:52