Heim >PHP-Framework >Denken Sie an PHP >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('\think\swoole\Manager'); // $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:
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!