ホームページ バックエンド開発 PHPチュートリアル PHP非同期処理async-helperサンプルの詳細説明

PHP非同期処理async-helperサンプルの詳細説明

Feb 06, 2018 pm 04:01 PM
php 詳しい説明

PHP 的异步进程助手,借助于 AMQP 实现异步执行 PHP 的方法,将一些很耗时、追求高可用、需要重试机制的操作放到异步进程中去执行,将你的 HTTP 服务从繁重的业务逻辑中解脱出来。以一个较低的成本将传统 PHP 业务逻辑转换成非阻塞、高可用、可扩展的异步模式。本文主要和大家介绍PHP异步进程助手async-helper的详细用法以及相关代码实例,对此有需要的朋友学习下。希望能帮助到大家。

依赖

  • 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
ログイン後にコピー

使用范例

业务逻辑:这里定义了很多等待被调用的类和方法,在你的项目中这可能是数据模型、或是一个发送邮件的类。


<?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([
      &#39;host&#39; => &#39;127.0.0.1&#39;,
      &#39;port&#39; => &#39;5672&#39;,
      &#39;user&#39; => &#39;root&#39;,
      &#39;pass&#39; => &#39;123456&#39;,
      &#39;vhost&#39; => &#39;/&#39;
    ]);
    // 第三步、保存用户信息到数据库
    $mail = [
      &#39;from&#39; => &#39;service@yourdomain.com&#39;, 
      &#39;to&#39; => &#39;username@163.com&#39;, 
      &#39;subject&#39; => &#39;恭喜你注册成功&#39;,
      &#39;body&#39; => &#39;请点击邮件中的链接完成验证....&#39;
    ];
    // 第四步、通过异步助手发送邮件
    $async_helper->run(&#39;\\SendMailHelper&#39;, &#39;request&#39;, [$mail]);
    
    // 这是同步的模式去发送邮件,如果邮件服务响应迟缓或异常,就会直接影响该请求的响应时间,甚至丢失这封重要邮件
    // SendMailHelper::request($mail);
  }
}
ログイン後にコピー

消费者:PHP 的异步进程,监听消息队列,执行你指定的方法。并且该消费者进程是可扩展的高可用的服务,这一切都得益于 AMQP,这是系统解耦、布局微服务的最佳方案。

consume.php


<?php
require_once(&#39;vendor/autoload.php&#39;);
require_once(&#39;SendMailHelper.php&#39;);

use l669\AsyncHelper;
use l669\CacheHelper;

$cache_helper = new CacheHelper(&#39;127.0.0.1&#39;, 11211);
while(true){
  try{
    $async_helper = new AsyncHelper([
      &#39;host&#39; => &#39;127.0.0.1&#39;,
      &#39;port&#39; => &#39;5672&#39;,
      &#39;user&#39; => &#39;root&#39;,
      &#39;pass&#39; => &#39;123456&#39;,
      &#39;vhost&#39; => &#39;/&#39;,
      &#39;cacheHelper&#39; => $cache_helper
    ]);
    $async_helper->consume();
  }catch(Exception $e){
    // 可以在这里记录一些日志
    sleep(2);
  }
}
ログイン後にコピー

# 在命令行下启动消费者进程,推荐使用 supervisor 来管理进程

php consume.php

支持事务:需要一次提交执行多个异步方法,事务可以确保完成性。


// 接着上面的示例来说,这里省略了一些重复的代码,下同
$async_helper->beginTransaction();
try{
  $async_helper->run(&#39;\\SendMailHelper&#39;, &#39;request&#39;, [$mail1]);
  $async_helper->run(&#39;\\SendMailHelper&#39;, &#39;request&#39;, [$mail2]);
  $async_helper->run(&#39;\\SendMailHelper&#39;, &#39;request&#39;, [$mail3]);
  $async_helper->commit();
}catch(\Exception $e){
  $async_helper->rollback();
}
ログイン後にコピー

阻塞式重试:当异步进程执行一个方法,方法内部抛出异常时进行重试,一些必须遵循执行顺序的业务就要采用阻塞式的重试,通过指定重试最大阻塞时长来控制。


use l669\CacheHelper;
use l669\AsyncHelper;
$async_helper = new AsyncHelper([
  &#39;host&#39; => &#39;127.0.0.1&#39;,
  &#39;port&#39; => &#39;5672&#39;,
  &#39;user&#39; => &#39;root&#39;,
  &#39;pass&#39; => &#39;123456&#39;,
  &#39;vhost&#39; => &#39;/&#39;,
  &#39;cacheHelper&#39; => new CacheHelper(&#39;127.0.0.1&#39;, 11211),
  &#39;retryMode&#39; => AsyncHelper::RETRY_MODE_REJECT, // 阻塞式重试
  &#39;maxDuration&#39; => 600              // 最长重试 10 分钟
]);
$send_mail_helper = new \SendMailHelper();
$mail = new \stdClass();
$mail->from = &#39;service@yourdomain.com&#39;;
$mail->to = &#39;username@163.com&#39;;
$mail->subject = &#39;恭喜你注册成功&#39;;
$mail->body = &#39;请点击邮件中的链接完成验证....&#39;;
$async_helper->run($send_mail_helper, &#39;request&#39;, [$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([
  &#39;host&#39; => &#39;127.0.0.1&#39;,
  &#39;port&#39; => &#39;5672&#39;,
  &#39;user&#39; => &#39;root&#39;,
  &#39;pass&#39; => &#39;123456&#39;,
  &#39;vhost&#39; => &#39;new&#39;,
  &#39;cacheHelper&#39; => new CacheHelper(&#39;127.0.0.1&#39;, 11211),
  &#39;queueName&#39; => &#39;emails.vip&#39;,          // 给付费的大爷走 VIP 队列
  &#39;retryMode&#39; => AsyncHelper::RETRY_MODE_TTL,   // 非阻塞式重试
  &#39;maxRetries&#39; => 10               // 最多重试 10 次
]);
$mail = new \stdClass();
$mail->from = &#39;service@yourdomain.com&#39;;
$mail->to = &#39;username@163.com&#39;;
$mail->subject = &#39;恭喜你注册成功&#39;;
$mail->body = &#39;请点击邮件中的链接完成验证....&#39;;
$async_helper->run(&#39;\\SendMailHelper&#39;, &#39;request&#39;, [$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 方法通过反射进行异步执行;

  • 高可用,执行方法进入消息队列,可持久化,即使服务器宕机,执行任务也不丢失;

  • 高可用,对异常可以进行不限次数和时间的重试,重试次数和时间可配置;

  • 支持对多个异步方法包含在事务中执行,支持回滚事务;

  • 方法的参数类型支持除资源类型(resource)和回调函数(callable)外的任意类型的参数;

  • AMQP のおかげで、非同期メソッドは高同時実行性と高負荷に耐え、クラスターのデプロイメントと水平拡張をサポートします

  • 低遅延、測定遅延時間 0.016 ~ 0.021 秒

  • 適用対象: 日常生活データベース操作、ログ収集、金融取引、メッセージプッシュ、電子メールとテキストメッセージの送信、データのインポートとエクスポート、大量のデータの計算とレポートの生成

関連する推奨事項:

スーパーバイザーを実装する Laravel の方法の詳細な説明。非同期処理を実行する

PHPフレームワークLaravelで非同期処理を実行するスーパーバイザを実装する方法

Laravelフレームワークで非同期処理を実行するスーパーバイザを実装する方法

以上がPHP非同期処理async-helperサンプルの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP はオープンソースの MVC フレームワークです。これにより、アプリケーションの開発、展開、保守がはるかに簡単になります。 CakePHP には、最も一般的なタスクの過負荷を軽減するためのライブラリが多数あります。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

See all articles