Asynchrone Task „Think-Swoole Task'.

Freigeben: 2020-10-27 13:39:09
nach vorne
3880 Leute haben es durchsucht

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
Nach dem Login kopieren

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,
//  ],
],
Nach dem Login kopieren

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);
    }
}
Nach dem Login kopieren

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();
        }
    }
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:阿dai哥
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!