Php携程 异步 使用场景,PHP协程使用场景

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值