久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

PHP異步進(jìn)程助手async-helper

這篇文章主要介紹了PHP異步進(jìn)程助手async-helper的詳細(xì)用法以及相關(guān)代碼實(shí)例,對(duì)此有需要的朋友學(xué)習(xí)下。

簡(jiǎn)介

PHP 的異步進(jìn)程助手,借助于 AMQP 實(shí)現(xiàn)異步執(zhí)行 PHP 的方法,將一些很耗時(shí)、追求高可用、需要重試機(jī)制的操作放到異步進(jìn)程中去執(zhí)行,將你的 HTTP 服務(wù)從繁重的業(yè)務(wù)邏輯中解脫出來。以一個(gè)較低的成本將傳統(tǒng) PHP 業(yè)務(wù)邏輯轉(zhuǎn)換成非阻塞、高可用、可擴(kuò)展的異步模式。

依賴

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

安裝

通過 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ā)送郵件,或是通過調(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 = new AsyncHelper([
      'host' => '127.0.0.1',
      'port' => '5672',
      'user' => 'root',
      'pass' => '123456',
      'vhost' => '/'
    ]);
    // 第三步、保存用戶信息到數(shù)據(jù)庫
    $mail = [
      'from' => 'service@yourdomain.com', 
      'to' => 'username@163.com', 
      'subject' => '恭喜你注冊(cè)成功',
      'body' => '請(qǐng)點(diǎn)擊郵件中的鏈接完成驗(yàn)證....'
    ];
    // 第四步、通過異步助手發(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)聽消息隊(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){
    // 可以在這里記錄一些日志
    sleep(2);
  }
}

# 在命令行下啟動(dòng)消費(fèi)者進(jìn)程,推薦使用 supervisor 來管理進(jìn)程

php consume.php

支持事務(wù):需要一次提交執(zhí)行多個(gè)異步方法,事務(wù)可以確保完成性。

// 接著上面的示例來說,這里省略了一些重復(fù)的代碼,下同
$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();
}

阻塞式重試:當(dāng)異步進(jìn)程執(zhí)行一個(gè)方法,方法內(nèi)部拋出異常時(shí)進(jìn)行重試,一些必須遵循執(zhí)行順序的業(yè)務(wù)就要采用阻塞式的重試,通過指定重試最大阻塞時(shí)長(zhǎng)來控制。

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              // 最長(zhǎng)重試 10 分鐘
]);
$send_mail_helper = new \SendMailHelper();
$mail = new \stdClass();
$mail->from = 'service@yourdomain.com';
$mail->to = 'username@163.com';
$mail->subject = '恭喜你注冊(cè)成功';
$mail->body = '請(qǐng)點(diǎn)擊郵件中的鏈接完成驗(yàn)證....';
$async_helper->run($send_mail_helper, 'request', [$mail]);

// 如果方法中需要拋出異常來結(jié)束程序,又不希望被異步進(jìn)程重試,可以拋出以下幾種錯(cuò)誤碼,進(jìn)程捕獲到這些異常后會(huì)放棄重試:
// l669\AsyncException::PARAMS_ERROR
// l669\AsyncException::METHOD_DOES_NOT_EXIST
// l669\AsyncException::KNOWN_ERROR
【網(wǎng)站聲明】本站除付費(fèi)源碼經(jīng)過測(cè)試外,其他素材未做測(cè)試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請(qǐng)勿用于商業(yè)用途。如損害你的權(quán)益請(qǐng)聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡(jiǎn)單分析了插值查找算法的概念、原理并結(jié)合實(shí)例形式分析了php實(shí)現(xiàn)針對(duì)有序表插值查找的相關(guān)操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實(shí)現(xiàn)服務(wù)端分頁的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP實(shí)現(xiàn)APP微信支付的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP實(shí)現(xiàn)的多維數(shù)組排序算法,結(jié)合實(shí)例形式對(duì)比分析了php針對(duì)多維數(shù)組及帶有鍵名的多維數(shù)組進(jìn)行排序相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
這篇文章主要為大家詳細(xì)介紹了php結(jié)合ajaxuploadfile實(shí)現(xiàn)無刷新文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
本篇文章給大家詳細(xì)介紹了PHP開發(fā)接口使用RSA進(jìn)行加密解密方法,對(duì)此有興趣的朋友可以學(xué)習(xí)下。
主站蜘蛛池模板: 欧美精品一区二区在线观看 | 成人免费视频网站在线看 | 中文字幕在线观 | 成人在线观看欧美 | 九九热精品视频 | 91麻豆精品国产91久久久资源速度 | 999精品视频 | 国产区在线 | 亚洲 自拍 另类 欧美 丝袜 | 91av在线免费看 | 一级做a爰片久久毛片免费看 | 日韩欧美视频在线 | 欧美第一区| 在线免费观看日本视频 | 亚洲成人精| 黄色片视频| 日批免费在线观看 | 91久久久久久久久久久 | av影音资源| 精品国产欧美一区二区三区成人 | 国产精品欧美一区二区三区不卡 | 欧美性视频在线播放 | 久久久久久国产一区二区三区 | 日韩欧美一区二区三区免费观看 | 国产精品国产 | 成年人视频免费在线观看 | 亚洲一区 中文字幕 | 美女国产 | 爱爱免费视频网站 | 91精品国产91久久久久久最新 | 欧美xxxx性xxxxx高清 | 久久中文一区二区 | 久久精品亚洲精品国产欧美 | 日韩视频区 | 日本一区二区不卡视频 | 欧美一区二区三区视频在线 | 欧美日韩在线不卡 | 一二区电影 | 日韩在线免费观看视频 | 91久久久久久久久久久 | 国产精品影视在线观看 |