「微信小程序」PHP异步进程async-helper实例详解

PHP异步进程async-helper实例详解

PHP 的异步进程助手,借助于 AMQP 实现异步执行 PHP 的方法,将一些很耗时、追求高可用、需要重试机制的操作放到异步进程中去执行,将你的 HTTP 服务从繁重的业务逻辑中解脱出来。以一个较低的成本将传统 PHP 业务逻辑转换成非阻塞、高可用、可扩展的异步模式。本文主要和大家介绍PHP异步进程助手async-helper的详细用法以及相关代码实例,对此有需要的朋友学习下。希望能帮助到大家。

依赖

php 5.6+

ext-bcmath

ext-amqp 1.9.1+

ext-memcached 3.0.3+

安装

通过 composer 安装

1

 

composer require l669/async-helper

 

或直接下载项目源码

1

 

wget https://github.com/l669306630/async-helper/archive/master.zip

 

使用范例

业务逻辑:这里定义了很多等待被调用的类和方法,在你的项目中这可能是数据模型、或是一个发送邮件的类。

1

2

3

4

5

6

7

8

9

10

11

12

13

 

<?php

class SendMailHelper

{

  /**

   * @param array $mail

   * @throws Exception

   */

  public static function request($mail)

  {

    // 在这里发送邮件,或是通过调用第三方提供的服务发送邮件

    // 发送失败的时候你抛出了异常,希望被进程捕获,并按设定的规则进行重试

  } 

}

 

生产者:通常是 HTTP 服务,传统的 PHP 项目或是一个命令行程序,接收到某个请求或指令后进行一系列的操作。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

 

<?php

use l669\AsyncHelper;

class UserController

{

  public function register()

  {

    // 假设这是一个用户注册的请求,用户提交了姓名、邮箱、验证码

    // 第一步、校验用户信息

    // 第二步、实例化异步助手,这时候会连接 AMQP

    $async_helper = new AsyncHelper([

      'host' => '127.0.0.1',

      'port' => '5672',

      'user' => 'root',

      'pass' => '123456',

      'vhost' => 'http://www.likecs.com/'

    ]);

    // 第三步、保存用户信息到数据库

    $mail = [

      'from' => 'service@yourdomain.com',

      'to' => 'username@163.com',

      'subject' => '恭喜你注册成功',

      'body' => '请点击邮件中的链接完成验证....'

    ];

    // 第四步、通过异步助手发送邮件

    $async_helper->run('\\SendMailHelper', 'request', [$mail]);

     

    // 这是同步的模式去发送邮件,如果邮件服务响应迟缓或异常,就会直接影响该请求的响应时间,甚至丢失这封重要邮件

    // SendMailHelper::request($mail);

  }

}

 

消费者:PHP 的异步进程,监听消息队列,执行你指定的方法。并且该消费者进程是可扩展的高可用的服务,这一切都得益于 AMQP,这是系统解耦、布局微服务的最佳方案。

consume.php

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

 

<?php

require_once('vendor/autoload.php');

require_once('SendMailHelper.php');

 

use l669\AsyncHelper;

use l669\CacheHelper;

 

$cache_helper = new CacheHelper('127.0.0.1', 11211);

while(true){

  try{

    $async_helper = new AsyncHelper([

      'host' => '127.0.0.1',

      'port' => '5672',

      'user' => 'root',

      'pass' => '123456',

      'vhost' => 'http://www.likecs.com/',

      'cacheHelper' => $cache_helper

    ]);

    $async_helper->consume();

  }catch(Exception $e){

    // 可以在这里记录一些日志

    sleep(2);

  }

}

 

# 在命令行下启动消费者进程,推荐使用 supervisor 来管理进程

php consume.php

支持事务:需要一次提交执行多个异步方法,事务可以确保完成性。

1

2

3

4

5

6

7

8

9

10

 

// 接着上面的示例来说,这里省略了一些重复的代码,下同

$async_helper->beginTransaction();

try{

  $async_helper->run('\\SendMailHelper', 'request', [$mail1]);

  $async_helper->run('\\SendMailHelper', 'request', [$mail2]);

  $async_helper->run('\\SendMailHelper', 'request', [$mail3]);

  $async_helper->commit();

}catch(\Exception $e){

  $async_helper->rollback();

}

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdxxx.html