• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP异步进程助手async-helper

    简介

    PHP 的异步进程助手,借助于 AMQP 实现异步执行 PHP 的方法,将一些很耗时、追求高可用、需要重试机制的操作放到异步进程中去执行,将你的 HTTP 服务从繁重的业务逻辑中解脱出来。以一个较低的成本将传统 PHP 业务逻辑转换成非阻塞、高可用、可扩展的异步模式。

    依赖

    安装

    通过 composer 安装

    composer require l669/async-helper

    或直接下载项目源码

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

    使用范例

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

    ?php
    class SendMailHelper 
    {
      /**
       * @param array $mail
       * @throws Exception
       */
      public static function request($mail)
      {
        // 在这里发送邮件,或是通过调用第三方提供的服务发送邮件
        // 发送失败的时候你抛出了异常,希望被进程捕获,并按设定的规则进行重试
      }  
    }

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

    ?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' => '/'
        ]);
        // 第三步、保存用户信息到数据库
        $mail = [
          'from' => 'service@yourdomain.com', 
          'to' => 'username@163.com', 
          'subject' => '恭喜你注册成功',
          'body' => '请点击邮件中的链接完成验证....'
        ];
        // 第四步、通过异步助手发送邮件
        $async_helper->run('\\SendMailHelper', 'request', [$mail]);
        
        // 这是同步的模式去发送邮件,如果邮件服务响应迟缓或异常,就会直接影响该请求的响应时间,甚至丢失这封重要邮件
        // SendMailHelper::request($mail);
      }
    }

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

    consume.php

    ?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' => '/',
          'cacheHelper' => $cache_helper
        ]);
        $async_helper->consume();
      }catch(Exception $e){
        // 可以在这里记录一些日志
        sleep(2);
      }
    }

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

    php consume.php

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

    // 接着上面的示例来说,这里省略了一些重复的代码,下同
    $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();
    }

    阻塞式重试:当异步进程执行一个方法,方法内部抛出异常时进行重试,一些必须遵循执行顺序的业务就要采用阻塞式的重试,通过指定重试最大阻塞时长来控制。

    use l669\CacheHelper;
    use l669\AsyncHelper;
    $async_helper = new AsyncHelper([
      'host' => '127.0.0.1',
      'port' => '5672',
      'user' => 'root',
      'pass' => '123456',
      'vhost' => '/',
      'cacheHelper' => new CacheHelper('127.0.0.1', 11211),
      'retryMode' => AsyncHelper::RETRY_MODE_REJECT, // 阻塞式重试
      'maxDuration' => 600              // 最长重试 10 分钟
    ]);
    $send_mail_helper = new \SendMailHelper();
    $mail = new \stdClass();
    $mail->from = 'service@yourdomain.com';
    $mail->to = 'username@163.com';
    $mail->subject = '恭喜你注册成功';
    $mail->body = '请点击邮件中的链接完成验证....';
    $async_helper->run($send_mail_helper, 'request', [$mail]);
    
    // 如果方法中需要抛出异常来结束程序,又不希望被异步进程重试,可以抛出以下几种错误码,进程捕获到这些异常后会放弃重试:
    // l669\AsyncException::PARAMS_ERROR
    // l669\AsyncException::METHOD_DOES_NOT_EXIST
    // l669\AsyncException::KNOWN_ERROR

    非阻塞式重试:当异步执行的方法内部抛出异常,async-helper 会将该方法重新放进队列的尾部,先执行新进入队列的方法,回头再重试刚才执行失败的方法,通过指定最大重试次数来控制。

    use l669\CacheHelper;
    use l669\AsyncHelper;
    $async_helper = new AsyncHelper([
      'host' => '127.0.0.1',
      'port' => '5672',
      'user' => 'root',
      'pass' => '123456',
      'vhost' => 'new',
      'cacheHelper' => new CacheHelper('127.0.0.1', 11211),
      'queueName' => 'emails.vip',          // 给付费的大爷走 VIP 队列
      'retryMode' => AsyncHelper::RETRY_MODE_TTL,   // 非阻塞式重试
      'maxRetries' => 10               // 最多重试 10 次
    ]);
    $mail = new \stdClass();
    $mail->from = 'service@yourdomain.com';
    $mail->to = 'username@163.com';
    $mail->subject = '恭喜你注册成功';
    $mail->body = '请点击邮件中的链接完成验证....';
    $async_helper->run('\\SendMailHelper', 'request', [$mail]);

    应用和解惑

    和传统 PHP 相比

    上一篇:详解PHP中的外观模式facade pattern
    下一篇:thinkPHP5框架数据库连贯操作之cache()用法分析
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    PHP异步进程助手async-helper PHP,异步,进程,助手,async-helper,