Think-Swoole Task 非同期タスク

リリース: 2020-10-27 13:39:09
転載
3765 人が閲覧しました

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

 finish(\app\listener\EmailTaskFinish::class);
    }
}
ログイン後にコピー

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

 request -> isPost()){
            $data = $this -> request -> post();
            //TODO 调用验证类验证数据
            //TODO 将注册信息插入数据库
            // 这里调用 Task 异步任务
            $server -> task(\app\listener\EmailTask::class);
            // 方式二
//            $manager = app('\think\swoole\Manager');
//            $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 までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!