ホームページ >PHPフレームワーク >ThinkPHP >Think-Swoole Task 非同期タスク

Think-Swoole Task 非同期タスク

藏色散人
藏色散人転載
2020-10-27 13:39:093937ブラウズ

Think-Swoole Task 非同期タスク

使用シナリオ

サーバー プログラムで次のような時間のかかる操作を実行する必要がある場合。ブロードキャストを送信するチャット サーバー、Web サーバーから電子メールを送信します。これらの関数を直接実行すると、現在のプロセスがブロックされ、サーバーの応答が遅くなります。例: ユーザー登録シナリオでは、登録を完了してアクティベーション電子メールを送信する機能には次の手順が必要です:

クライアントが POST データを送信 -> サーバーがデータを取得 -> 登録を完了して書き込みユーザー データをデータベースに保存 - > アカウント アクティベーション電子メールを送信 -> クライアントに戻り、登録が成功したことを示すメッセージが表示されます。

このビジネス ロジックには問題はありませんが、電子メールの送信は時間のかかる操作 (2 ~ 3 秒など) であり、送信後にクライアントが正常に登録するように求められるまで、プログラムの実行が同期的にブロックされます。送信は成功しました。このプロセスでは、送信から最終的な登録成功の通知までに約 4 秒かかると推定されており、リクエストの応答には 4 秒かかります。

タスクの非同期タスク配信を使用すると、ユーザー エクスペリエンスが大幅に向上します。一般的なプロセスは次のとおりです:

クライアントが POST データを送信 -> サーバーがデータを取得 -> 登録と完了ユーザー データをデータベースに書き込みます -> すぐにクライアントに戻り、登録が成功したことを示すプロンプトを表示します。

登録が成功したらタスク タスクを配信します -> 時間のかかる電子メール送信操作を非同期で完了します (応答がクライアントに返されているため、ユーザーはこの部分に気づきません)非常に早い)。

Think-Swoole の Task 非同期タスク ステップの使用方法

イベント リスニング クラス (php think make:listener クラス名) を定義します。

swoole.task のイベント監視は app/event.php ファイルで定義されます。

Swoole/Server オブジェクトを取得し、タスク メソッドを呼び出します (パラメータで定義したばかりのリスニング クラスを渡します)。

定義したばかりのイベント リスニング クラスのハンドル メソッドでトリガー コールバック ロジック コードを定義します。

タスクが完了した後、タスク swoole.finish をトリガーする終了メソッドを呼び出します (必須ではなく、必要な場合にのみ呼び出されます)。

デモ

まず、プロジェクトのルート ディレクトリにメール送信イベントを作成します:

php think make:listener EmailTask

次に、作成したメール送信イベントを定義します:

app/event.php
'listen'    => [
    'AppInit'  => [],
    'HttpRun'  => [],
    'HttpEnd'  => [],
    'LogLevel' => [],
    'LogWrite' => [],
    'swoole.task' => [
        app\listener\EmailTask::class,
    ],
//  'swoole.finish' => [
//      app\listener\EmailTaskFinish::class,
//  ],
],

swoole.task のキー名は Task ですが、タスクの記述方法は決まっており、任意に名前を付けることはできません。

次に、ユーザー登録を担当するコントローラーの Swoole/Server クラスを介して Task 非同期タスクを呼び出します。もちろん、最初に EmailTask​​.php のロジック コードを改善する必要があります:

app /listener/EmailTask​​.php

<?php
declare (strict_types = 1);
namespace app\listener;
class EmailTask
{
    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event)
{
        echo "开始发送邮件:".time();
        //模拟耗时 3 秒,测试是否在响应事件内
        sleep(3);
        echo "邮件发送成功:".time();
        // 可以调用 finish 方法通知其他事件类,通知当前异步任务已经完成了(非必须调用)
        // 参数 $event 是 Swoole\Server\Task 类的一个对象 可以调用 finish 方法触发 task 任务的 onFinish 事件
        // $event -> finish(\app\listener\EmailTaskFinish::class);
    }
}

登録メソッド app/controller/Register.php

<?php
namespace app\controller;
use app\BaseController;
class Register extends BaseController
{
    public function register(\Swoole\Server $server)
{
        if($this -> request -> isPost()){
            $data = $this -> request -> post();
            //TODO 调用验证类验证数据
            //TODO 将注册信息插入数据库
            // 这里调用 Task 异步任务
            $server -> task(\app\listener\EmailTask::class);
            // 方式二
//            $manager = app(&#39;\think\swoole\Manager&#39;);
//            $manager -> getServer() -> task(\app\listener\EmailTask::class);
            return "注册成功!".time();
        }
    }
}

登録ビジネスでは、データベースに挿入した後、電子メールを送信する非同期タスクが呼び出され、電子メールは EmailTask​​.php でシミュレートされます。これには 3 秒かかります。

Think-Swoole サービスを開き、登録メソッドにアクセスし、電子メールの送信時間がユーザー登録メソッドに含まれているかどうかをテストします:

Think-Swoole Task 非同期タスク

Visible 、電子メールが送信されます。3 秒間は非同期で実行され、ユーザーはそれを認識しません。

さらに、現在の非同期タスクが完了したことを他のイベントに通知するために使用される swoole.finish イベントがあります。また、イベントを作成し、app/event で swoole.finish を定義する必要があります。 php. 上記のサンプルコードはデモされています。

以上がThink-Swoole Task 非同期タスクの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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