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
PHP有序表查找之插值查找算法示例这篇文章主要介绍了PHP有序表查找之插值查找算法,简单分析了插值查找算法的概念、原理并结合实例形式分析了php实
ThinkPHP整合datatables实现服务端分页的示例代码下面小编就为大家分享一篇ThinkPHP整合datatables实现服务端分页的示例代码,具有很好的参考价值,希望对大家有所帮
PHP实现APP微信支付的实例讲解下面小编就为大家分享一篇PHP实现APP微信支付的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小
PHP实现的多维数组排序算法分析这篇文章主要介绍了PHP实现的多维数组排序算法,结合实例形式对比分析了php针对多维数组及带有键名的多维数组进行
php+ajax实现无刷新文件上传功能(ajaxuploadfile)这篇文章主要为大家详细介绍了php结合ajaxuploadfile实现无刷新文件上传功能,具有一定的参考价值,感兴趣的小伙伴们
PHP的RSA加密解密方法以及开发接口使用本篇文章给大家详细介绍了PHP开发接口使用RSA进行加密解密方法,对此有兴趣的朋友可以学习下。