Heim >PHP-Framework >Denken Sie an PHP >Asynchrone Task „Think-Swoole Task'.

Asynchrone Task „Think-Swoole Task'.

藏色散人
藏色散人nach vorne
2020-10-27 13:39:093938Durchsuche

Asynchrone Task „Think-Swoole Task'.

Nutzungsszenarien

Wenn Sie zeitaufwändige Vorgänge im Serverprogramm ausführen müssen, z. B. das Senden von Broadcasts an einen Chat-Server und das Senden von E-Mails an einen Webserver. Wenn Sie diese Funktionen direkt ausführen, wird der aktuelle Prozess blockiert, was dazu führt, dass der Server langsam reagiert. Beispiel: Im Benutzerregistrierungsszenario erfordert die Funktion zum Abschließen der Registrierung und zum Versenden von Aktivierungs-E-Mails die folgenden Schritte:

Der Client übermittelt POST-Daten –> Der Server ruft die Daten ab –> die Datenbank -> Kontoaktivierungs-E-Mail senden-> Zurück zum Client, um zu bestätigen, dass die Registrierung erfolgreich war.

Mit dieser Geschäftslogik gibt es kein Problem, aber da das Senden einer E-Mail ein zeitaufwändiger Vorgang ist (z. B. 2-3 Sekunden) und gleichzeitig die Ausführung des Programms blockiert, bis der Client nach dem Senden einer erfolgreichen Registrierung aufgefordert wird Der Versand ist erfolgreich. Bei diesem Vorgang dauert es schätzungsweise etwa 4 Sekunden von der Übermittlung bis zur endgültigen Benachrichtigung über die erfolgreiche Registrierung. Eine Anfrageantwort dauert 4 Sekunden, was definitiv unangemessen ist!

Die Verwendung der asynchronen Aufgabenzustellung kann das Benutzererlebnis erheblich verbessern. Der allgemeine Prozess ist:

Der Client übermittelt POST-Daten –> Der Server ruft die Registrierung ab und schreibt die Benutzerdaten in die Datenbank. > Kehrt sofort zur Client-Eingabeaufforderung zurück. Registrierung erfolgreich.

Liefern Sie eine Aufgabenaufgabe, wenn die Registrierung erfolgreich ist –> Schließen Sie den zeitaufwändigen Vorgang des Sendens der E-Mail asynchron ab (der Benutzer ist sich dieses Teils der Zeit nicht bewusst, da die Antwort sehr früh an den Client zurückgesendet wurde) .

Schritte zur Verwendung der asynchronen Aufgabe „Task“ von Think-Swoole

Ereignis-Listening-Klasse definieren (php think make:Listener-Klassenname).

Die Ereignisüberwachung von swoole.task ist in der Datei app/event.php definiert.

Holen Sie sich das Swoole/Server-Objekt und rufen Sie die Task-Methode auf (übergeben Sie die soeben im Parameter definierte Abhörklasse).

Definieren Sie den Trigger-Callback-Logikcode in der Handle-Methode der gerade definierten Event-Listening-Klasse.

Rufen Sie die Finish-Methode auf, die die Aufgabe swoole.finish auslöst, nachdem die Aufgabe abgeschlossen ist (wird nur bei Bedarf aufgerufen, nicht erforderlich).

Demonstration

Erstellen Sie zunächst ein E-Mail-Versandereignis im Projektstammverzeichnis:

php think make:listener EmailTask

Definieren Sie dann das erstellte E-Mail-Versandereignis:

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

Der Schlüsselname von swoole.task ist Task. Die Aufgabe ist behoben und kann nicht ausgeführt werden willkürlich benannt werden.

Als nächstes rufen wir die asynchrone Task Task über die Swoole/Server-Klasse im Controller auf, der für die Benutzerregistrierung verantwortlich ist. Natürlich müssen wir zuerst den Logikcode von EmailTask.php verbessern:

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);
    }
}

In der Registrierungsmethode 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();
        }
    }
}

Im Registrierungsgeschäft wird nach dem Einfügen in die Datenbank die asynchrone Aufgabe zum Senden von E-Mails aufgerufen. Das Simulieren des E-Mail-Versands in EmailTask.php dauert 3 Sekunden.

Öffnen Sie den Think-Swoole-Dienst, greifen Sie auf die Registrierungsmethode zu und testen Sie, ob die Zeit des E-Mail-Versands in der Benutzerregistrierungsmethode enthalten ist:

Asynchrone Task „Think-Swoole Task.

Es ist ersichtlich, dass die 3 Sekunden des E-Mail-Versands asynchron sind Der Benutzer nimmt es nicht wahr.

Darüber hinaus gibt es ein swoole.finish-Ereignis, mit dem andere Ereignisse darüber informiert werden, dass die aktuelle asynchrone Aufgabe abgeschlossen wurde. Sie müssen außerdem ein Ereignis erstellen und swoole.finish in app/event.php definieren Beispielcode wurde demonstriert.

Das obige ist der detaillierte Inhalt vonAsynchrone Task „Think-Swoole Task'.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:阿dai哥. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen