亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP異步進程助手async-helper

2024-05-05 00:02:13
字體:
來源:轉載
供稿:網友

簡介

PHP 的異步進程助手,借助于 AMQP 實現異步執行 PHP 的方法,將一些很耗時、追求高可用、需要重試機制的操作放到異步進程中去執行,將你的 HTTP 服務從繁重的業務邏輯中解脫出來。以一個較低的成本將傳統 PHP 業務邏輯轉換成非阻塞、高可用、可擴展的異步模式。

依賴

  • php 5.6+
  • ext-bcmath
  • ext-amqp 1.9.1+
  • ext-memcached 3.0.3+

安裝

通過 composer 安裝

composer require l669/async-helper

或直接下載項目源碼

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

使用范例

業務邏輯:這里定義了很多等待被調用的類和方法,在你的項目中這可能是數據模型、或是一個發送郵件的類。

<?phpclass 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

<?phprequire_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]);

應用和解惑

  • 我們采用的是開源的 RabbitMQ 來為我們提供的 AMQP 服務。
  • 你的項目部署在擁有很多服務器節點的集群上,每個節點的程序都需要寫日志文件,現在的問題就是要收集所有節點上面的日志到一個地方,方便我們及時發現問題或是做一些統計。所有節點都可以使用 async-helper 異步調用一個寫日志的方法,而執行這個寫日志的方法的進程只需要在一臺機器上啟動就可以了,這樣所有節點的日志就都實時掌握在手里了。
  • 做過微信公眾號開發的都知道,騰訊微信可以將用戶的消息推送到我們的服務器,如果我們在 5s 內未及時響應,騰訊微信會重試 3 次,其實這就是消息隊列的應用,使用 async-helper 可以輕松的做和這一樣的事情。
  • 得益于 RabbitMQ,你可以輕松的橫向擴展你的消費者進程的能力,因為 RabbitMQ 天生就支持集群部署,你可以輕松的啟動多個消費者進程,或是將消費者進程分布到多臺機器上。
  • 如果 RabbitMQ 服務不可用怎么辦呢?部署 RabbitMQ 高可用服務是容易的,對外提供單一 IP,這個 IP 是個負載均衡,背后是 RabbitMQ 集群,負載均衡承擔對后端集群節點的健康檢查。
  • async-helper 能否承受高并發請求?async-helper 生產者使用的是短連接,也就說在你的 HTTP 還沒有響應瀏覽器的時候 async-helper 就已經結束了工作,你連接 RabbitMQ 的時間是百分之百小于 HTTP 請求的時間的,換言之,只要 RabbitMQ 承受并發的能力超過你的 HTTP 服務的承受并發的能力,RabbitMQ 就永遠不會崩,通過橫向擴展 RabbitMQ 很容易做到的。

 

和傳統 PHP 相比

  • 對任何 PHP 方法通過反射進行異步執行;
  • 高可用,執行方法進入消息隊列,可持久化,即使服務器宕機,執行任務也不丟失;
  • 高可用,對異??梢赃M行不限次數和時間的重試,重試次數和時間可配置;
  • 支持對多個異步方法包含在事務中執行,支持回滾事務;
  • 方法的參數類型支持除資源類型(resource)和回調函數(callable)外的任意類型的參數;
  • 得益于 AMQP,異步方法可以承受高并發、高負載,支持集群部署、橫向擴展;
  • 低延時,實測延時時間 0.016 ~ 0.021s;
  • 適用于:日常數據庫操作、日志收集、金融交易、消息推送、發送郵件和短信、數據導入導出、計算大量數據生成報表;

注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕自拍vr一区二区三区| 亚洲jizzjizz日本少妇| 亚洲偷熟乱区亚洲香蕉av| 久久久精品中文字幕| 少妇精69xxtheporn| zzijzzij亚洲日本成熟少妇| 中文字幕免费精品一区| 欧美日韩美女视频| 91精品国产自产在线观看永久| 国产亚洲激情视频在线| 日本中文字幕久久看| 亚洲aaa激情| 超碰精品一区二区三区乱码| 日韩在线免费观看视频| 国语自产精品视频在线看| 亚洲精选在线观看| 欧美日韩电影在线观看| 亚洲激情视频网| 欧洲日本亚洲国产区| 国产精选久久久久久| 精品国产999| 91精品久久久久久久久久久| 久久在线精品视频| 欧美成人在线影院| 国产精品久久久久999| 97精品视频在线播放| 国产精品成人一区二区三区吃奶| 6080yy精品一区二区三区| 97国产成人精品视频| 精品久久久久人成| 18性欧美xxxⅹ性满足| 欧美精品少妇videofree| 国产成人精品久久二区二区91| 色综合天天狠天天透天天伊人| 色中色综合影院手机版在线观看| 国产一区二区在线免费视频| 国内揄拍国内精品| 欧美在线性视频| 狠狠色狠狠色综合日日五| 久久久久久久影视| 久久久精品视频在线观看| 中文字幕一区二区三区电影| 日韩av毛片网| 亚洲美腿欧美激情另类| 欧美一级淫片videoshd| 欧美精品www在线观看| 国模gogo一区二区大胆私拍| 精品久久香蕉国产线看观看亚洲| 亚洲福利视频网站| 久热在线中文字幕色999舞| 在线视频欧美性高潮| 久久久久亚洲精品成人网小说| 最近2019年好看中文字幕视频| 久久精品成人动漫| 亚洲精品在线91| 成人黄色影片在线| 97在线视频免费播放| 宅男66日本亚洲欧美视频| 日韩成人av在线播放| 一道本无吗dⅴd在线播放一区| 欧美劲爆第一页| 亚洲人成亚洲人成在线观看| 国内精品久久久久影院优| 97色在线观看免费视频| 91沈先生作品| 成人综合国产精品| 久久综合免费视频影院| 成人妇女淫片aaaa视频| 在线电影av不卡网址| 成人免费观看网址| 国产精品欧美激情在线播放| 精品国产依人香蕉在线精品| 国产精品久久久久高潮| 欧美亚洲视频一区二区| 久久久综合免费视频| 伊人久久男人天堂| 欧美高跟鞋交xxxxxhd| 欧美乱大交做爰xxxⅹ性3| 色婷婷久久一区二区| 中文字幕一区二区精品| 91香蕉嫩草影院入口| 国产精品jizz在线观看麻豆| 国产午夜精品全部视频在线播放| 久久久亚洲福利精品午夜| 成人啪啪免费看| 欧美另类99xxxxx| 成人深夜直播免费观看| 91精品国产综合久久久久久久久| 欧美日韩精品在线| 亚洲成人动漫在线播放| 日韩视频在线观看免费| www欧美日韩| 高潮白浆女日韩av免费看| 亚洲欧美日本另类| 91精品国产91久久久久久久久| 伊人伊成久久人综合网站| 亚洲精品视频免费在线观看| 日日狠狠久久偷偷四色综合免费| 国产日韩欧美影视| 黄色成人在线免费| 国产精品第2页| 欧美黄色片免费观看| 久久在线观看视频| 热re99久久精品国产66热| 欧美专区第一页| 一本大道亚洲视频| 欧美高清第一页| 热门国产精品亚洲第一区在线| 亚洲xxxx视频| 欧美麻豆久久久久久中文| 97国产精品视频| 午夜精品久久久久久久99热| 91久久久久久| 欧美激情在线观看视频| 国产男女猛烈无遮挡91| 久久综合免费视频| 亚洲国产一区二区三区在线观看| 国产精品三级久久久久久电影| 日韩欧美中文第一页| 亚洲女人天堂av| 国产精品网站入口| 精品国产欧美一区二区五十路| 欧美中文字幕在线播放| 免费91麻豆精品国产自产在线观看| 亚洲人成电影在线观看天堂色| 欧美国产日韩xxxxx| 国产亚洲视频中文字幕视频| 国产精品电影网| 久久久精品网站| 欧美中文字幕在线播放| 亚洲一区二区三区久久| 在线观看精品国产视频| 国产精品一区二区三| 国产精品av网站| 欧美一级在线播放| 91精品国产高清久久久久久| 精品久久久香蕉免费精品视频| 国产精品一二三视频| 国产亚洲人成网站在线观看| 亚洲国产精品电影| 国产精品久久久久久久9999| 岛国av一区二区| 91系列在线播放| 国产精品一区二区3区| 精品夜色国产国偷在线| 国产区精品在线观看| 欧美激情一级精品国产| 亚洲午夜未删减在线观看| 亚洲欧美日韩综合| 国产欧美日韩最新| 亚洲18私人小影院| 日韩免费在线播放| 国产精品视频成人| 久久精品色欧美aⅴ一区二区| 国产日韩欧美中文在线播放| 欧美激情免费视频| 亚洲激情 国产| 欧美在线视频在线播放完整版免费观看| 成人春色激情网| 中文字幕精品国产| 亚洲爱爱爱爱爱| 韩国一区二区电影| 激情成人在线视频| 亚洲人成网站色ww在线|