Was ist nebenläufige Verarbeitung?
Wenn Sie mehrere Anfragen an externe APIs oder Datenbank-Aggregationen, die nicht voneinander abhängen, nacheinander ausführen, entspricht die Gesamtdauer der Summe der einzelnen Laufzeiten. Führen Sie sie hingegen gleichzeitig aus, verkürzt sich die Gesamtdauer auf die Zeit der langsamsten Einzelverarbeitung. Die FacadeConcurrency von Laravel realisiert eine solche nebenläufige Ausführung über eine einfache API.
Die Facade
Concurrency wurde in Laravel 11 eingeführt und steht auch in Laravel 13 weiterhin zur Verfügung.
Der Standardtreiber verwendet PHP-Kindprozesse und benötigt keine zusätzlichen Pakete.Funktionsweise
Die FacadeConcurrency serialisiert die übergebenen Closures, schickt sie an einen versteckten Artisan-Befehl und lässt sie jeweils in einem separaten PHP-Prozess ausführen.
Nach Abschluss werden die Rückgabewerte serialisiert und an den Elternprozess zurückgereicht.
Es stehen drei Treiber zur Verfügung:
| Treiber | Beschreibung |
|---|---|
process | Standard. Startet PHP-Kindprozesse für die Ausführung. Funktioniert auch im Kontext eines Web-Requests. |
fork | Benötigt das Paket spatie/fork. Erzeugt Kindprozesse per Fork; nur im CLI verwendbar, aber sehr schnell. |
sync | Führt die Closures nicht nebenläufig, sondern nacheinander aus. Eignet sich für Tests. |
Grundlegende Verwendung
Concurrency::run()
Übergeben Sie der Methoderun() ein Array mit Closures, werden diese nebenläufig ausgeführt.
Der Rückgabewert enthält die Ergebnisse der jeweiligen Closures als Array.
Treiber angeben
Um einen bestimmten Treiber zu verwenden, nutzen Sie die Methodedriver().
default an.
Verwendung des fork-Treibers
Der fork-Treiber ist schneller als der process-Treiber, funktioniert aber ausschließlich in PHP-CLI-Umgebungen (z. B. in Artisan-Befehlen oder Queue-Workern).
Innerhalb eines Web-Requests kann er nicht verwendet werden.
Installieren Sie vor der Nutzung das Paket spatie/fork.
Ohne Rückgabewerte: Concurrency::defer()
Interessieren Sie sich nicht für die Ergebnisse und möchten die Verarbeitung im Hintergrund nach dem Senden der HTTP-Antwort ausführen, verwenden Sie die Methodedefer().
defer() werden die Closures noch nicht ausgeführt.
Sie laufen erst nebenläufig, nachdem die HTTP-Antwort an den Nutzer gesendet wurde.
Praxisbeispiel: mehrere externe APIs gleichzeitig aufrufen
Nehmen wir das Dashboard eines E-Commerce-Systems, das Daten aus drei APIs bezieht: Bestandsführung, Umsatzstatistik und Versandstatus.Sequenzielle Ausführung (vor der Optimierung)
Nebenläufige Ausführung (nach der Optimierung)
Mehrere Datenbank-Aggregationen gleichzeitig
Konfiguration für Tests
In Testumgebungen führt dersync-Treiber die Closures nacheinander aus.
Es entfällt der Overhead durch das Starten von Prozessen, wodurch Tests schneller laufen.
.env.testing festlegen.
Hinweise
Einschränkungen bei Closures
Einschränkungen bei Closures
Closures werden serialisiert und an Kindprozesse übergeben.
Objekte, die nicht serialisierbar sind (Datenbankverbindungen, Datei-Handles, Ressourcen usw.), können nicht von außerhalb der Closure eingefangen werden.
Erstellen Sie die benötigten Objekte innerhalb der Closure neu.
Overhead des process-Treibers
Overhead des process-Treibers
Der
process-Treiber ist mit dem Aufwand für das Starten eines Kindprozesses verbunden. Ist die Verarbeitung selbst sehr kurz (wenige Millisekunden), bringt die nebenläufige Ausführung möglicherweise keinen Vorteil.
Ihre Stärke spielt sie bei Arbeiten von 100 ms und mehr aus – etwa HTTP-Anfragen oder Datenbank-Aggregationen.Einschränkung des fork-Treibers
Einschränkung des fork-Treibers
Der
fork-Treiber forkt einen PHP-Prozess und kann daher nicht innerhalb eines Web-Requests (FPM oder Apache) genutzt werden.
Verwenden Sie ihn ausschließlich in Artisan-Befehlen oder Queue-Workern.Umgang mit Ausnahmen
Umgang mit Ausnahmen
Tritt während der nebenläufigen Ausführung eine Ausnahme auf, wirft
run() diese erneut.
Wenn Sie möchten, dass andere Verarbeitungen weiterlaufen, obwohl eine Closure fehlschlägt, fangen Sie die Ausnahme innerhalb der Closure mit try/catch ab.Nächste Schritte
Queues und Jobs
Erfahren Sie, wie Sie Arbeit asynchron im Hintergrund über Queues und Jobs verarbeiten.