H Empfohlen: „pPhp-Video-Tutorial
“
Bei den meisten in PHP geschriebenen Programmen besteht der einzige Zweck darin, einfache Prozesse auszuführen, die aus mehreren Aufgaben bestehen. Die Aufgabe muss der Reihe nach ausgeführt werden, z. B. die Datenverarbeitung. Wir müssen immer das Anhalten und Warten der synchronen Programmierung ertragen. Der synchrone Stil der Codeausführung wird als Blockieren bezeichnet, was bedeutet, dass Aufgaben nacheinander ausgeführt werden. Was also, wenn wir Aufgaben ausführen möchten, ohne dass sie sich gegenseitig blockieren, was bedeutet, dass wir einen nicht blockierenden Prozess benötigen? Dieser Ansatz erfordert die Anwendung asynchroner Programmiermethoden in PHP, bei denen Aufgaben ohne gegenseitige Abhängigkeit ausgeführt werden.
Eine gängige Methode zur nicht blockierenden Ausführung in PHP ist die Implementierung der Warteschlangenverarbeitung. Aufgaben werden auf einem Transportmittel wie MySQL, Redis, Amazon SQS usw. gespeichert, das von einem Hintergrundarbeiter abgerufen und entsprechend ausgeführt wird, sodass der Hauptprozess, der die Aufgabe erstellt hat, nicht blockiert wird. Laravel-Anwendungen bieten einen Warteschlangenmechanismus, der es ermöglicht, Aufgaben (in diesem Fall Jobs genannt) zur Verarbeitung auf einen späteren Zeitpunkt zu verschieben.
Ein anderer Ansatz besteht darin, alle definierten Aufgaben parallel auszuführen. Was wir von diesem Ansatz wissen, ist, dass er, sobald eine bestimmte Aufgabe abgeschlossen ist, die Kontrolle an den Hauptprozess zurückgeben kann, mit dem Versprechen, den Code auszuführen und uns später über die Ergebnisse zu informieren (z. B. Rückruf). Man sieht möglicherweise selten Anwendungsfälle für parallele Verarbeitungsmethoden; ein Beispielanwendungsfall könnte darin bestehen, eine Bildverarbeitung durchzuführen und eine GET-Anfrage an einen externen Dienst zu stellen.
Sehen wir uns den Unterschied zwischen synchronen und asynchronen (parallelen) Prozessen in PHP anhand eines sehr einfachen Anwendungsfalls an.
Synchroner Code
foreach (range(1, 5) as $i) {
$output = $i * 2;
echo $output . "\n";
}
Nach dem Login kopieren
Asynchroner Code
use Spatie\Async\Pool;
$pool = Pool::create();
foreach (range(1, 5) as $i) {
$pool[] = async(function () use ($i) {
$output = $i * 2;
return $output;
})->then(function (int $output) {
echo $output . "\n";
});
}
await($pool);
Nach dem Login kopieren
Wenn wir den ersten Code ausführen, erhalten wir die Ausgabewerte in der folgenden Reihenfolge: 2
4
6
8
10
Nach dem Login kopieren
Versuchen Sie die Ausführung erneut und wir erhalten die gleiche Reihenfolge wie obige Ausgabe. Daher wartet jede Multiplikationsoperation darauf, vor der nächsten Multiplikationsoperation ausgeführt zu werden. Führen Sie als Nächstes den zweiten Codeblock aus und sehen Sie, was wir erhalten.
6
10
2
8
4
Nach dem Login kopieren
Zweiter Wiederholungsversuch:
2
6
4
10
8
Nach dem Login kopieren
Ein Prozess führt zu zwei unterschiedlichen Ergebnissen. Genau das erhalten wir mit asynchronen Methoden. Unsere kleinen Aufgaben können blockierungsfrei ausgeführt werden. Jede Multiplikationsaufgabe wird unabhängig ausgeführt, einige schneller als andere, sodass die Ausgabe durcheinander ist. Beachten Sie außerdem, dass unsere asynchrone Funktion als then-Methode angehängt ist, die für die Rückübernahme der Kontrolle verantwortlich ist, und dass sie eine Callback-Funktion als Argument akzeptiert, die nun zusätzliche Aktionen für die empfangene Ausgabe ausführen kann.
Die Leute von Spatie haben dieses nette
spacee/async
-Paket entwickelt, das bei der parallelen Ausführung von Aufgaben hilft. Sie können dieses Paket über Composer installieren:
composer require spatie/async
Nach dem Login kopieren
Dieses Paket bietet eine praktische Möglichkeit, mit erstellten Aufgaben zu interagieren, die parallel ausgeführt werden. Der Ereignis-Listener der Aufgabe wird wie folgt beschrieben:
- Führen Sie den Vorgang erneut aus, wenn die Aufgabe abgeschlossen ist, da der Rückruf über die Methode
then
implementiert werden kann.
- Wenn eine bestimmte Aufgabe mithilfe der
catch
-Methode eine Ausnahme auslöst, ist die Fehlerbehandlung einfacher zu kontrollieren.
- Die Methode
timeout
ermöglicht die Handhabung von Szenarien, in denen eine Aufgabe ihren Vorgang nicht abschließt.
spacee/async
包,它有助于并行执行任务。你可以通过 Composer 安装该包:
$pool
->add(function () {
// 要在并行进程中执行的任务
})
->then(function ($output) {
// 如果成功,进程或者你传递到队列的回调函数会返回`$output`。
})
->catch(function ($exception) {
// 当进程内抛出异常时,它会被捕获并传递到这里。
})
->timeout(function () {
// 哦,不! 一个过程花了太长时间才完成。 让我们做点什么吧
})
;
Nach dem Login kopieren
该包提供了一种巧妙的方式来与创建的任务进行交互,这些任务将被并行执行。任务的事件监听器描述如下:
- 当任务完成时再执行一次操作,是因为回调可以通过它的
then
方法来实现。
- 当一个特定的任务使用
catch
方法抛出异常时,错误处理更容易控制。
- 当一个任务没有完成其操作时,
timeout
方法允许人们处理这样的场景。
事件监听器与如下所示的任务挂钩:
rrreee
要了解更多关于这个spacee/async
Der Ereignis-Listener ist mit einer Aufgabe wie dieser verbunden:
rrreee
Um mehr über dieses spacee/async
-Paket zu erfahren, lesen Sie unter seinen Mitwirkenden. Für diesen Artikel, Sie kann auch auf das GitHub-Repository verweisen.
Originaladresse: https://dev.to/webong/using-asynchronous-processes-in-php-7io
Übersetzungsadresse: https://learnku.com/php/t/51334🎜🎜
Das obige ist der detaillierte Inhalt vonBringen Sie Ihnen bei, die Spatie/Async-Bibliothek zum Schreiben von asynchronem PHP-Code zu verwenden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!