async-helper 簡(jiǎn)介 PHP 的異步進(jìn)程助手,借助于 AMQP 實(shí)現(xiàn)異步執(zhí)行 PHP 的方法,將一些很耗時(shí)、追求高可用、需要重試機(jī)制的操作放到異步進(jìn)程中去執(zhí)行,將你的 HTTP 服務(wù)從繁重的業(yè)務(wù)邏輯中解脫出來(lái)。以一個(gè)較低的成本將傳統(tǒng) PHP 業(yè)務(wù)邏輯轉(zhuǎn)換成非阻塞、高可用、可擴(kuò)展的異步模式。 依賴 php 7.1.5+
ext-bcmath
ext-amqp 1.9.1+
ext-memcached 3.0.3+
安裝 通過(guò) composer 安裝 composer require l669/async-helper 或直接下載項(xiàng)目源碼
wget https://github.com/l669306630/async-helper/archive/master.zip 使用范例 業(yè)務(wù)邏輯:這里定義了很多等待被調(diào)用的類和方法,在你的項(xiàng)目中這可能是數(shù)據(jù)模型、或是一個(gè)發(fā)送郵件的類。
<>php
class SendMailHelper
{
/**
* @param array $mail
* @throws Exception
*/
public static function request($mail)
{
// 在這里發(fā)送郵件,或是通過(guò)調(diào)用第三方提供的服務(wù)發(fā)送郵件
// 發(fā)送失敗的時(shí)候你拋出了異常,希望被進(jìn)程捕獲,并按設(shè)定的規(guī)則進(jìn)行重試
}
}
生產(chǎn)者:通常是 HTTP 服務(wù),傳統(tǒng)的 PHP 項(xiàng)目或是一個(gè)命令行程序,接收到某個(gè)請(qǐng)求或指令后進(jìn)行一系列的操作。 <>php
use l669\AsyncHelper;
class UserController
{
public function register()
{
// 假設(shè)這是一個(gè)用戶注冊(cè)的請(qǐng)求,用戶提交了姓名、郵箱、驗(yàn)證碼
// 第一步、校驗(yàn)用戶信息
// 第二步、實(shí)例化異步助手,這時(shí)候會(huì)連接 AMQP
$async_helper = AsyncHelper([
'host' => '127.0.0.1',
'port' => '5672',
'user' => 'root',
'pass' => '123456',
'vhost' => '/'
]);
// 第三步、保存用戶信息到數(shù)據(jù)庫(kù)
$mail = [
'from' => 'service@yourdomain.com',
'to' => 'username@163.com',
'subject' => '恭喜你注冊(cè)成功',
'body' => '請(qǐng)點(diǎn)擊郵件中的鏈接完成驗(yàn)證,吧啦啦啦'
];
// 第四步、通過(guò)異步助手發(fā)送郵件
$async_helper->run('\\SendMailHelper', 'request', [$mail]);
// 這是同步的模式去發(fā)送郵件,
// 如果郵件服務(wù)響應(yīng)遲緩或異常,就會(huì)直接影響該請(qǐng)求的響應(yīng)時(shí)間,甚至丟失這封重要郵件。
// SendMailHelper::request($mail);
}
}
消費(fèi)者:PHP 的異步進(jìn)程,監(jiān)聽(tīng)消息隊(duì)列,執(zhí)行你指定的方法。并且該消費(fèi)者進(jìn)程是可擴(kuò)展的高可用的服務(wù),這一切都得益于 AMQP,這是系統(tǒng)解耦、布局微服務(wù)的最佳方案。 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){
// 可以在這里記錄一些日志
}
}
php consume.php 和傳統(tǒng) PHP 相比 對(duì)任何 PHP 方法通過(guò)反射進(jìn)行異步執(zhí)行; 高可用,執(zhí)行方法進(jìn)入消息隊(duì)列,即使服務(wù)器宕機(jī),執(zhí)行任務(wù)也不丟失; 高可用,對(duì)異??梢赃M(jìn)行不限次數(shù)和時(shí)間的重試,重試次數(shù)和時(shí)間可配置; 支持對(duì)多個(gè)異步方法包含在事務(wù)中執(zhí)行,支持回滾事務(wù); 方法的參數(shù)類型支持除資源類型(resource)和回調(diào)函數(shù)(callable)外的任意類型的參數(shù); 得益于 AMQP,異步方法可以承受高并發(fā)、高負(fù)載,支持集群部署、橫向擴(kuò)展; 低延時(shí),實(shí)測(cè)延時(shí)時(shí)間 0.016 ~ 0.021s; 適用于:日常數(shù)據(jù)庫(kù)操作、日志收集、金融交易、消息推送、發(fā)送郵件和短信、數(shù)據(jù)導(dǎo)入導(dǎo)出、計(jì)算大量數(shù)據(jù)生成報(bào)表; 附錄 安裝 memcached 安裝 rabbitmq 安裝 php7.1.5、ext-amqp、ext-memcached 安裝 supervisor
|