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 相比
本文向大家介绍浅谈node.js中async异步编程,包括了浅谈node.js中async异步编程的使用技巧和注意事项,需要的朋友参考一下 1.什么是异步编程? 异步编程是指由于异步I/O等因素,无法同步获得执行结果时, 在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数、ajax请求等等。 示例: 这里大部分人会认为输出123,或者333。其实它会输出 444 这里就是我
稳定性: 1 - 试验的 async_hooks 模块提供了一个用于注册回调函数的 API,这些回调函数可追踪在 Node.js 应用中创建的异步资源的生命周期。可以通过以下方式使用: const async_hooks = require('async_hooks'); Terminology An asynchronous resource represents an object with
本文向大家介绍Javascript异步编程async实现过程详解,包括了Javascript异步编程async实现过程详解的使用技巧和注意事项,需要的朋友参考一下 async官方DOC 介绍 node安装 npm install async --save 使用 var async = require('async') js文件 https://github.com/caolan/async/tre
近年来,在面向高并发编程的道路上,Node.js 与 Golang 风生水起,让人们渐渐把目光从多线程模型转移到 callback 与 CSP/Actor 上,用惯了 FPM 多进程同步阻塞模型的 PHPer 中总难免有人心动。
EasySwoole支持在定时器、控制器处理中等多处位置使用异步进程。 CoreSwooleAsyncTaskManager是对Swoole Task的封装实现。 AbstractAsyncTask CoreAbstractInterfaceAbstractAsyncTask 定义了异步任务的接口实现,一个异步任务对象都应当基础AbstractAsyncTask。 class Task exten
异步编程对JavaScript语言太重要。Javascript语言的执行环境是“单线程”的,如果没有异步编程,根本没法用,非卡死不可。 ES6诞生以前,异步编程的方法,大概有下面四种。 回调函数 事件监听 发布/订阅 Promise 对象 ES6将JavaScript异步编程带入了一个全新的阶段,ES7的Async函数更是提出了异步编程的终极解决方案。 基本概念 异步 所谓"异步",简单说就是一个