Fibers (PHP 8.1)
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 60 von 91.
Fibers sind eine Funktion von PHP 8.1, die eine unterbrechbare Codeausführung ermöglicht. Im Gegensatz zu regulären Funktionen, die von Anfang bis Ende durchlaufen, kann ein Fiber die Ausführung mittendrin pausieren und später wieder aufnehmen, wobei der Zustand zwischen den Pausen erhalten bleibt.
Erstellen Sie einen Fiber, indem Sie ein Callable an die Fiber-Klasse übergeben und ihn dann mit start() starten:
<?php
$fiber = new Fiber(function(): void {
echo "Step 1\n";
Fiber::suspend();
echo "Step 2\n";
});
$fiber->start();
echo "Between steps\n";
$fiber->resume();
Ausgabe:
Step 1
Between steps
Step 2Der Fiber läuft, bis er auf Fiber::suspend() trifft, dann kehrt die Steuerung zum Hauptcode zurück. Der Aufruf von resume() setzt die Ausführung an der Stelle fort, an der sie unterbrochen wurde.
Fibers können auch Werte übergeben, wenn sie unterbrochen und fortgesetzt werden:
<?php
$fiber = new Fiber(function(): string {
$value = Fiber::suspend("paused");
return "Received: $value";
});
$suspended = $fiber->start();
echo "$suspended\n";
$result = $fiber->resume("hello");
echo $result;
Ausgabe:
paused
Received: helloFibers sind die Grundlage für asynchrone PHP-Frameworks. Obwohl Sie sie in den meisten Anwendungen nicht direkt verwenden werden, hilft das Verständnis derselben bei der Arbeit mit asynchronen Bibliotheken, die gleichzeitige Operationen wie HTTP-Anfragen oder Datenbankabfragen ohne Blockierung verarbeiten.
Aufgabe
EinfachLassen Sie uns einen Task-Scheduler erstellen, der demonstriert, wie Fibers die Ausführung unterbrechen und fortsetzen können, während Daten zwischen dem Fiber und dem Hauptcode übertragen werden. Sie werden ein System erstellen, in dem Aufgaben unterbrochen werden können, sodass in der Zwischenzeit andere Arbeiten erledigt werden können.
Sie werden Ihren Code in zwei Dateien organisieren:
TaskRunner.php— Erstellen Sie eineTaskRunner-Klasse, die die Fiber-Funktionalität zum Ausführen von Aufgaben kapselt. Die Klasse sollte:- Eine private Eigenschaft besitzen, um eine
Fiber-Instanz zu speichern - Einen Aufgabennamen (String) in ihrem Konstruktor mittels Constructor Promotion akzeptieren
- Eine Methode
createTask(callable $task)besitzen, die eine neue Fiber mit dem angegebenen Callable erstellt und diese speichert - Eine Methode
start()besitzen, die die Fiber startet und den Wert zurückgibt, mit dem die Fiber suspendiert (oder den endgültigen Rückgabewert) - Eine Methode
continue(mixed $value)besitzen, welche die Fiber mit dem angegebenen Wert fortsetzt und den nächsten suspendierten Wert (oder den endgültigen Rückgabewert) zurückgibt - Eine Methode
isFinished(): boolbesitzen, die zurückgibt, ob die Fiber beendet wurde
- Eine private Eigenschaft besitzen, um eine
main.php— Binden Sie die TaskRunner-Datei ein. Sie erhalten zwei Eingaben: einen Aufgabennamen und eine Nachricht, die an die Fiber gesendet werden soll.Erstellen Sie einen
TaskRunnermit dem angegebenen Aufgabennamen und verwenden Sie danncreateTask(), um eine Aufgabe zu definieren, die:- Zuerst mit dem String
"Waiting for input"suspendiert - Einen Wert erhält, wenn sie fortgesetzt wird
"Completed: [received value]"zurückgibt
Starten Sie die Aufgabe und geben Sie aus, was sie zurückgibt, wenn sie zum ersten Mal suspendiert. Geben Sie dann
"Processing..."aus, um zu zeigen, dass zwischen den Fiber-Pausen Arbeit verrichtet wird. Setzen Sie schließlich die Fiber fort, indem Sie die eingegebene Nachricht übergeben, und geben Sie das Endergebnis aus.- Zuerst mit dem String
Diese Herausforderung zeigt, wie Fibers kooperatives Multitasking ermöglichen — Ihre Aufgabe pausiert sich selbst an einem günstigen Punkt, der Hauptcode erledigt andere Arbeiten und setzt dann die Aufgabe mit neuen Daten fort. Die Fiber behält ihren Zustand die ganze Zeit über bei und macht genau dort weiter, wo sie aufgehört hat.
Spickzettel
Fibers ermöglichen eine unterbrechbare Code-Ausführung in PHP 8.1+. Im Gegensatz zu regulären Funktionen kann ein Fiber mitten in der Ausführung pausieren und später fortgesetzt werden, während sein Zustand beibehalten wird.
Erstellen Sie einen Fiber, indem Sie ein Callable an die Fiber-Klasse übergeben und ihn mit start() starten:
<?php
$fiber = new Fiber(function(): void {
echo "Step 1\n";
Fiber::suspend();
echo "Step 2\n";
});
$fiber->start();
echo "Between steps\n";
$fiber->resume();
Der Fiber läuft bis Fiber::suspend(), dann kehrt die Kontrolle zum Hauptcode zurück. Rufen Sie resume() auf, um die Ausführung an der Stelle fortzusetzen, an der sie pausiert wurde.
Fibers können Werte beim Suspendieren und Fortsetzen übergeben:
<?php
$fiber = new Fiber(function(): string {
$value = Fiber::suspend("paused");
return "Received: $value";
});
$suspended = $fiber->start();
$result = $fiber->resume("hello");
Wichtige Methoden:
start()— beginnt die Fiber-AusführungFiber::suspend($value)— pausiert die Ausführung und gibt einen Wert an den Aufrufer zurückresume($value)— setzt die Ausführung fort und übergibt einen Wert an den FiberisTerminated()— prüft, ob der Fiber beendet wurde
Probier es selbst
<?php
require_once 'TaskRunner.php';
// Eingaben lesen
$taskName = trim(fgets(STDIN));
$message = trim(fgets(STDIN));
// TODO: Erstelle einen TaskRunner mit dem angegebenen Task-Namen
// TODO: Verwende createTask(), um einen Task zu definieren, der:
// 1. Zuerst mit dem String "Waiting for input" suspendiert
// 2. Einen Wert erhält, wenn er fortgesetzt wird
// 3. "Completed: [received value]" zurückgibt
// TODO: Starte den Task und gib aus, was er beim ersten Suspendieren zurückgibt
// TODO: Gib "Processing..." aus, um zu zeigen, dass zwischen den Fiber-Pausen gearbeitet wird
// TODO: Setze den Fiber fort, indem die Nachrichteneingabe übergeben wird
// TODO: Gib das Endergebnis aus
?>Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas $this-SchlüsselwortMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick - Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDas parent:: SchlüsselwortMethoden überschreibenDas final SchlüsselwortAbstrakte KlassenZusammenfassung – Mitarbeiter-Hierarchie7Kapselung
Public, Protected, PrivateZugriffsmodifikatoren im DetailGetter und SetterInformation HidingConstructor Promotion (8.0)Zusammenfassung – Studentenverwaltungssystem10Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungDependency InjectionAnonyme KlassenEnums (PHP 8.1)Fibers (PHP 8.1)Objekt-Klonen im DetailGeneratoren & Iteratoren2Namensräume & Autoloading
Einführung in NamensräumeDas use-SchlüsselwortPSR-4 Autoloading-StandardComposer AutoloaderZusammenfassung – Organisiertes Projekt5Interfaces & Verträge
Einführung in InterfacesInterfaces implementierenMehrfache Interface-ImplementierungInterface vs. Abstrakte KlasseType Hinting mit InterfacesZusammenfassung – Formen-Rechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objekt-Klonen__serialize & __unserializeZusammenfassung - Eigene Collection11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenEigene Exception-HierarchieTry, Catch, FinallyZusammenfassung - Formular-Validator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klasseneigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenReadonly-Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphismus
Method Overriding erneut betrachtetPolymorphismus über InterfacesType Hinting & Union TypesLate Static BindingZusammenfassung – Payment Processor9Traits
Einführung in TraitsVerwendung mehrerer TraitsKonfliktlösung bei TraitsAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung