ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

PHP协程使用场景

2021-03-09 16:02:32  阅读:241  来源: 互联网

标签:multi ch 协程 setopt ret 场景 curl PHP gen


 1 <?php
 2 class Test {
 3     public function async() {
 4          
 5         $start = microtime(true);
 6         $url = "http://waimai.baidu.com/waimai?qt=poisug";  //随意的一个接口
 7         $i = 50; //假设请求N次
 8         $new_ids = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
 9         foreach ($new_ids as $new_id) {
10             $gen[$new_id] = $this->_request("{$url}&news_id={$new_id}");
11             //实际应用中可能在多次请求之间有其他事情要处理,否则我们可以直接使用curl_multi
12             //suppose i can do something here
13         }
14          
15         $ret = $this->_dealGen($gen);
16         var_dump($ret);
17         $end = microtime(true);
18         echo $end - $start;
19          
20     }
21        
22     protected function _request($url) {
23          
24         $mh = curl_multi_init();       
25         $ch = curl_init();
26         curl_setopt($ch, CURLOPT_URL, $url);      
27         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
28         curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
29         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
30         curl_setopt($ch, CURLOPT_MAXREDIRS, 7);
31         curl_multi_add_handle($mh, $ch);
32         do {
33             $mrc = curl_multi_exec($mh, $active);
34             //可以看到很多参考代码这里是sleep(),其实浪费了程序执行的时间
35             yield null;  //先去请求,不用等待结果
36         } while ($active > 0); 
37          
38         $raw = curl_multi_getcontent($ch);
39         curl_multi_remove_handle($mh, $ch);
40         curl_multi_close($mh);
41         yield $raw;    
42     }
43      
44     protected function _dealGen($gens) {
45               
46         $ret = array();
47         do {
48             $running = false;
49             foreach ($gens as $id => $gen) {              
50                 if ($gen->valid()) {
51                     //有任意没处理完的yield就继续进行处理
52                     $running = true;
53                     $gen->next();
54                     $tmp = $gen->current();
55                     if ($tmp !== null) {
56                         $ret[$id] = $tmp;
57                     }
58                 }
59             }
60         } while ($running);       
61         return $ret;          
62     }
63 }
64 
65 $test = new Test();
66 $test->async();

 

标签:multi,ch,协程,setopt,ret,场景,curl,PHP,gen
来源: https://www.cnblogs.com/jiemoon/p/14506063.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有