Heim >Backend-Entwicklung >PHP-Tutorial >Was ist PHP Fiber? Bietet Ihnen PHP Fiber wirklich eine asynchrone Ausführung?

Was ist PHP Fiber? Bietet Ihnen PHP Fiber wirklich eine asynchrone Ausführung?

DDD
DDDOriginal
2024-12-02 19:59:16900Durchsuche

What is PHP Fiber? Does PHP Fiber Really Give You Asynchronous Execution?

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.

Was sind PHP-Fasern?

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.

Hauptmerkmale von Fasern:

  • Sie können die Ausführung starten, anhalten und fortsetzen.
  • Sie arbeiten im selben PHP-Prozess und führen kein Multithreading ein.
  • Sie sind besonders nützlich für die Strukturierung von nicht blockierendem Code.

Was passiert, wenn eine Glasfaser unterbrochen wird?

Wenn eine Fiber mit Fiber::suspend() angehalten wird, kehrt die Steuerung zum Haupt-PHP-Skript zurück. Das bedeutet:

  • Der Hauptprozess steht Ihnen zur weiteren Ausführung anderer Teile Ihres Programms zur Verfügung.
  • Die Ausführung der Fiber wird vorübergehend angehalten und wartet auf einen Resume()-Aufruf.

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:

  • Fiber::suspend() pausiert die Fiber. Die Ausführung wechselt nach $fiber->start().
  • zurück zum Hauptskript
  • Das Hauptskript läuft weiter („After Fibre Start“).
  • Wenn „resume()“ aufgerufen wird, macht die Fiber dort weiter, wo sie aufgehört hat, und schließt ihre Aufgabe ab.

Blockiert die Wiederaufnahme einer Glasfaser den Hauptprozess?

Ja, aber nur vorübergehend. Wenn Sie Fiber::resume() aufrufen, wird Fiber synchron im Haupt-PHP-Prozess ausgeführt. Während dieser Zeit:

  • Andere Teile Ihres Skripts (oder anderer Fasern) können erst ausgeführt werden, wenn die Faser abgeschlossen ist oder erneut angehalten wird.
  • Die Ausführung der Fiber blockiert, da PHP weiterhin Single-Threaded ist. Zum Beispiel:
$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.

Wieso sind Fasern immer noch „blockierungsfrei“?

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:

  • Lange laufende oder wartende Aufgaben (z. B. Datenbankabfragen, API-Aufrufe) können angehalten werden.
  • Andere Aufgaben können in der Zwischenzeit weiterlaufen.
  • Sobald die Aufgabe fertig ist, wird die Fiber wieder aufgenommen und ihre Ausführung fortgesetzt.

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.

Warum Fasern nicht wirklich asynchron sind.

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:

  • Synchronisierte Ausführung innerhalb eines einzelnen PHP-Prozesses.
  • Bieten Sie kooperatives Multitasking, indem Sie dem Entwickler ermöglichen, die Unterbrechung und Wiederaufnahme von Aufgaben manuell zu steuern.

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!

Stellungnahme:
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