ホームページ  >  記事  >  PHPフレームワーク  >  この記事では、ThinkPHP で think-queue を使用して Redis メッセージ キューを実装する方法を説明します。

この記事では、ThinkPHP で think-queue を使用して Redis メッセージ キューを実装する方法を説明します。

WBOY
WBOY転載
2022-06-28 15:33:143935ブラウズ

この記事では、thinkphp に関する関連知識を提供します。主に、think-queue を使用して Redis メッセージ キューを実装する際の関連問題を整理しています。一緒に見てみましょう。みんな。 。

この記事では、ThinkPHP で think-queue を使用して Redis メッセージ キューを実装する方法を説明します。

推奨される学習: 「PHP ビデオ チュートリアル

簡単な紹介:

メッセージ キューの中央 ソフトウェアは大規模システムの重要なコンポーネントであり、徐々にエンタープライズ システムの内部通信の中核手段になってきました。疎結合、非同期メッセージング、トラフィックのピークカット、信頼性の高い配信、ブロードキャスト、フロー制御、結果整合性などの一連の機能を備えており、非同期 RPC の主要な手段の 1 つとなっています。

言語:

メッセージ キューには 2 つのロールとコンテナーがあります。ロールはプロデューサー (タスクの公開を担当) とコンシューマー (タスクの実行を担当) です。コンテナーは / を保存するために使用されます。プロデューサーによってリリースされたタスクをスタックし、互いに影響を与えることなくリリースと実行の 2 つのステップを分離します。

メッセージ キューの一般的なプロセスは次のとおりです:

プロデューサはタスクをパブリッシュしてメッセージ キューに保存/蓄積し、コンシューマは主導権を持ってメッセージ キューからタスクを取り出して実行します。最初に公開されたタスクが最初に実行されます (キュー: 先入れ先出し)。コンシューマがない場合、タスクは実行のために取り出されるのを待ってキューに蓄積されます。

利点:

メッセージ キューは、同時実行性が高い、または処理時間が長い、バッチ操作が必要なサードパーティ インターフェイスに適しています。テキスト メッセージの送信や電子メールの送信に使用できますが、これらに限定されません。 、APP プッシュなど、クロスシステムをサポートしています。つまり、このシステムによって公開されたメッセージ キューは、単独でタスクを実行することも、他のシステムに対してタスクを実行することもできます。同様に、このシステムは、メッセージ キューを実行するコンシューマとしても機能します自身または他のシステムによって公開されたタスク。


以下では主に think-queue の使用方法を紹介します

ThinkPHP の Queue には、Redis、Database、Topthink、Sync の 4 つのドライバーが組み込まれています。Redis はここで使用されており、またRedis

シンクキュー キュー メッセージは、公開、取得、実行、削除、再公開、遅延公開、タイムアウト制御、その他の操作などのタスクを実行できます

メッセージ キューの基本構成

エクストラ ディレクトリに queue.php 設定ファイルを作成します。

<?phpreturn  [
    &#39;connector&#39;  => 'Redis',
    'expire'     => null,   // 任务过期时间,默认为60秒,若要禁用,则设置为 null
    'default'    => 'REDIS_QUEUE',  // 默认的队列名
    'host'       => '127.0.0.1',   // redis 主机ip
    'port'       => 6379,   // redis 端口
    'password'   => '',   // redis 密码
    'select'     => 0,   // 使用哪里一个 db,默认为 db0
    'timeout'    => 0,   // redis 连接的超时时间
    'persistent' => false,   // 是否是长连接];

なぜここに配置されるかというと、Queue のソース コードがデフォルトでエクストラからキュー ファイルを読み取って、設定情報。設定ファイルを別の場所に配置する場合は、以下の図に示すように、ソース コード内のデフォルトの取得設定をそれに応じて変更する必要があります。プロデューサー

テスト クラスを作成し、プロデューサー メソッドを作成しますこの記事では、ThinkPHP で think-queue を使用して Redis メッセージ キューを実装する方法を説明します。

<?phpnamespace  app\api\controller;use think\Controller;use think\Queue;class Test extends Controller{
    // 生产者,添加消息队列
    public function addQueue()
    {
        // 参数
        $data = [
            &#39;id&#39; => rand(0, 99),
            'userName' => '一起摸鱼'
        ];

        // 消息队列名
        $queueName = 'testQueue';

        // 推入消息队列,注意这里的 ::class 是PHP5.5才有的写法
        $isPushed = Queue::push(TestQueue::class, $data, $queueName);
		// PHP5.5以下的可以直接写命名空间
        // $isPushed = Queue::push('app\common\queue\TestQueue', $data, $queueName);
        
        if ($isPushed !== false) {
            // 成功之后的业务
            echo '队列加入成功';
        } else {
            // 失败之后的业务
            echo '队列加入失败';
        }
    }}
Consumer

メッセージ キュー内のタスクを実行するためにコンシューマーとして使用される TestQueue クラスを作成します

<?phpnamespace  app\common\queue;use think\Log;use think\queue\Job;class TestQueue{
    // 消费者执行入口
    public function fire(Job $job, $data)
    {
        // 具体执行业务
        $isJobDone = $this->doJob($data);
        
        if ($isJobDone) {
            // 消息队列执行成功,删除队列,否则会一直执行
            $job->delete();
        } else {
            // 消息队列执行失败
            // 获取消息队列已经重试了几遍
            $attempts = $job->attempts();
            if ($attempts == 0 || $attempts == 1) {
                // 重新发布,参数 delay 是延时发布的时间
                $job->release(2);
            }
        }
    }

    // 消息队列执行失败后会自动执行该方法
    public function failed($data)
    {
        Log::error('消息队列达到最大重复执行次数后失败:' . json_encode($data));
    }

    // 消息队列执行方法
    public function doJob($data)
    {
        // 具体执行业务
        
        
        $data = json_encode($data);
        echo '消息队列:' . $data;
        // 这里的判断条件以具体业务是否执行成功进行判断
        if ($data) {
            echo "执行成功";
            return true;
        } else {
            echo "执行失败";
            return false;
        }
    }}
実行結果

リクエスト インターフェイス、プロデューサー パブリッシュ タスク

redis キュー ストレージ タスク

この記事では、ThinkPHP で think-queue を使用して Redis メッセージ キューを実装する方法を説明します。

次のステップは、キューのリスニング モードを有効にすることです。タスクが追加されるたびにキューを手動で実行することは不可能であるためです。キューには 2 つのリスニング モードがあり、設定パラメータは次のとおりです:

この記事では、ThinkPHP で think-queue を使用して Redis メッセージ キューを実装する方法を説明します。

プロジェクト ルート ディレクトリで実行します

この記事では、ThinkPHP で think-queue を使用して Redis メッセージ キューを実装する方法を説明します。php think queue: work --queue キュー名

#コンシューマーを開いてタスクを実行します

#Redis キュー内のタスクも実行後に削除されます


この記事では、ThinkPHP で think-queue を使用して Redis メッセージ キューを実装する方法を説明します。ただし、必要に応じて、ターミナルを閉じた後もキューを開始できるように、コンシューマー デーモン プロセスの実行を一時停止する必要もあります。

nohup php think queue:listen --queue キュー名&

この記事では、ThinkPHP で think-queue を使用して Redis メッセージ キューを実装する方法を説明します。

PS: シェル終了時に入力します。ターミナルを終了するには

この記事では、ThinkPHP で think-queue を使用して Redis メッセージ キューを実装する方法を説明します。

PS: シェルに exit と入力してターミナルを終了します
PS: exit と入力しますシェル ターミナルを終了しますnohup が正常に実行され、プログラムを閉じるボタンをクリックしてターミナルを閉じると、コマンドに対応するセッションが切断され、コマンドに対応するプロセスが発生します。 nohup も一緒にシャットダウンする必要があることが通知されます。
この時点で、メッセージ キューのプロセス全体が終了しました。 推奨学習: 「PHP ビデオ チュートリアル

以上がこの記事では、ThinkPHP で think-queue を使用して Redis メッセージ キューを実装する方法を説明します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。