Als PHP 8.1 Fibers einführte, fragten sich viele Entwickler, ob sie eine Lösung für die langjährige Beschränkung von PHP als Single-Threaded-synchrone Sprache darstellten. Könnten Fibers PHP asynchron machen, wie JavaScript mit seinen Event-Loops oder Node.js? Die Antwort ist subtil: Fibers bieten keine echte asynchrone Ausführung, sind aber ein leistungsstarkes Tool zur effizienteren Verwaltung von Aufgaben. Lassen Sie uns dieses Konzept im Detail untersuchen.
Fasern sind ein Mechanismus zur Implementierung von kooperativem Multitasking in PHP. Sie ermöglichen es Ihnen, bestimmte Teile des Codes anzuhalten und fortzusetzen, ohne den gesamten PHP-Prozess zu blockieren. Stellen Sie sich eine Fiber als eine spezialisierte Funktion vor, die die Kontrolle wieder an das Hauptprogramm „übergeben“ kann und dann bei Bedarf die Ausführung an der Stelle fortsetzen kann, an der sie aufgehört hat.
Wenn eine Fiber mit Fiber::suspend() angehalten wird, kehrt die Steuerung zum Haupt-PHP-Skript zurück. Das bedeutet:
Zum Beispiel:
$fiber = new Fiber(function () { echo "Fiber started\n"; Fiber::suspend(); echo "Fiber resumed\n"; }); echo "Before Fiber\n"; $fiber->start(); echo "After Fiber Start\n"; $fiber->resume(); echo "After Fiber Resume\n"; Output:
Before Fiber Fiber started After Fiber Start Fiber resumed After Fiber Resume
Hier ist, was passiert:
Ja, aber nur vorübergehend. Wenn Sie Fiber::resume() aufrufen, wird Fiber synchron im Haupt-PHP-Prozess ausgeführt. Während dieser Zeit:
$fiber = new Fiber(function () { echo "Processing Fiber...\n"; sleep(2); // Simulates a blocking task echo "Fiber Done\n"; }); echo "Before Fiber\n"; $fiber->start(); echo "Between Fiber Start and Resume\n"; $fiber->resume(); echo "After Fiber\n"; Output:
Before Fiber Processing Fiber... Fiber Done Between Fiber Start and Resume After Fiber
Hier blockiert die Faser den Hauptprozess während des Sleep(2)-Aufrufs. Obwohl Fasern eine Möglichkeit bieten, Code effizienter zu strukturieren, ermöglichen sie nicht auf magische Weise eine parallele oder wirklich asynchrone Ausführung.
Der Begriff „nicht blockierend“ bezieht sich darauf, wie Fibers eine bessere Aufgabenverwaltung und nicht eine parallele Ausführung ermöglichen. Eine Fiber blockiert den Hauptprozess nicht, während er angehalten ist; Stattdessen wird die Kontrolle an das Hauptskript oder eine Ereignisschleife zurückgegeben.
Dies ist besonders nützlich für Bibliotheken oder Frameworks, die ereignisgesteuerte Architekturen wie ReactPHP oder Amp verwenden, wobei:
Stellen Sie sich vor, Sie wären ein Koch, der mehrere Gerichte zubereitet:
Sie fangen an, ein Gericht zu kochen, machen aber eine Pause und warten, bis etwas kocht.
Während Sie warten, beginnen Sie mit der Zubereitung eines weiteren Gerichts.
Wenn das erste Gericht fertig ist, kehren Sie zu ihm zurück und kochen weiter.
In ähnlicher Weise ermöglicht Fibers PHP, eine Aufgabe „anzuhalten“ und später zu ihr zurückzukehren, ohne den gesamten Prozess zu unterbrechen.
Im Gegensatz zur asynchronen Programmierung in JavaScript oder Node.js, bei der Aufgaben mithilfe von Threads oder einer Ereignisschleife parallel ausgeführt werden können, ist Fibers:
Mit anderen Worten:
Fasern führen nicht zu Parallelität (Aufgaben werden immer noch einzeln ausgeführt).
Sie sind ein Werkzeug zur effizienteren Verwaltung und Strukturierung von nicht blockierendem Code.
Obwohl PHP-Fasern PHP nicht wirklich asynchron machen, sind sie eine leistungsstarke Ergänzung der Sprache.
Das obige ist der detaillierte Inhalt vonWas ist PHP Fiber? Bietet Ihnen PHP Fiber wirklich eine asynchrone Ausführung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!