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 ausgeführt werden, kann ein Fiber seine Ausführung zwischendrin pausieren und später fortsetzen, wobei sein Zustand zwischen den Pausen erhalten bleibt.
Erstelle einen Fiber, indem du der Klasse Fiber einen aufrufbaren Wert übergibst, und starte ihn dann mit start():
<?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 Kontrolle zum Hauptcode zurück. Der Aufruf von resume() setzt die Ausführung an der Stelle fort, an der sie pausiert wurde.
Fibers können beim Anhalten und Fortsetzen auch Werte übergeben:
<?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 bilden die Grundlage für asynchrone PHP-Frameworks. Obwohl du sie in den meisten Anwendungen nicht direkt verwenden wirst, hilft dir das Verständnis von Fibers bei der Arbeit mit asynchronen Bibliotheken, die gleichzeitige Vorgänge wie HTTP-Anfragen oder Datenbankabfragen ohne Blockierung verarbeiten.
Aufgabe
EinfachErstelle einen Task-Scheduler, der veranschaulicht, wie Fasern die Ausführung pausieren und fortsetzen können, während Daten zwischen der Faser und dem Hauptcode übertragen werden. Du erstellst ein System, in dem Tasks unterbrochen werden können, sodass dazwischen andere Arbeiten ausgeführt werden können.
Du organisierst deinen Code auf zwei Dateien verteilt:
TaskRunner.php: Erstelle eineTaskRunner-Klasse, die die Funktionalität von Fasern zum Ausführen von Tasks kapselt. Die Klasse sollte:- eine private Eigenschaft zum Speichern einer
Fiber-Instanz besitzen - in ihrem Konstruktor mithilfe von Constructor Promotion einen Task-Namen (String) akzeptieren
- eine Methode
createTask(callable $task)besitzen, die eine neue Fiber mit dem angegebenen Callable erstellt und speichert - eine Methode
start()besitzen, die die Faser startet und den Wert zurückgibt, mit dem die Faser pausiert (oder den endgültigen Rückgabewert) - eine Methode
continue(mixed $value)besitzen, die die Faser mit dem angegebenen Wert fortsetzt und den nächsten pausierten Wert (oder den endgültigen Rückgabewert) zurückgibt - eine Methode
isFinished(): boolbesitzen, die zurückgibt, ob die Faser beendet wurde
- eine private Eigenschaft zum Speichern einer
main.php: Binde die TaskRunner-Datei ein. Du erhältst zwei Eingaben: einen Task-Namen und eine Nachricht, die an die Faser gesendet werden soll.Erstelle einen
TaskRunnermit dem angegebenen Task-Namen und verwende danncreateTask(), um einen Task zu definieren, der:- zuerst mit dem String
"Waiting for input"pausiert - beim Fortsetzen einen Wert empfängt
"Completed: [received value]"zurückgibt
Starte den Task und gib aus, was er beim ersten Pausieren zurückgibt. Gib anschließend
"Processing..."aus, um zu zeigen, dass zwischen den Pausen der Faser Arbeit ausgeführt wird. Setze die Faser schließlich fort, indem du ihr die Nachrichteneingabe übergibst, und gib das Endergebnis aus.- zuerst mit dem String
Diese Aufgabe zeigt, wie Fasern kooperatives Multitasking ermöglichen. Dein Task pausiert sich an einer geeigneten Stelle, der Hauptcode führt andere Arbeiten aus und setzt den Task anschließend mit neuen Daten fort. Die Faser behält währenddessen ihren Zustand bei und macht genau dort weiter, wo sie aufgehört hat.
Probier es selbst
<?php
require_once 'TaskRunner.php';
// Eingaben lesen
$taskName = trim(fgets(STDIN));
$message = trim(fgets(STDIN));
// TODO: Erstelle einen TaskRunner mit dem gegebenen Task-Namen
// TODO: Verwende createTask(), um eine Aufgabe zu definieren, die:
// 1. First suspends with the string "Waiting for input"
// 2. Einen Wert empfängt, wenn sie fortgesetzt wird
// 3. "Completed: [received value]" zurückgibt
// TODO: Starte die Aufgabe und gib aus, was sie zurückgibt, wenn sie zum ersten Mal unterbrochen wird
// TODO: Gib "Processing..." aus, um zu zeigen, dass zwischen Fiber-Pausen Arbeit stattfindet
// TODO: Setze den Fiber fort, indem du die message-Eingabe übergibst
// 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 OOPKlassen vs. ObjekteDas Schlüsselwort $thisMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDas Schlüsselwort parent::MethodenüberschreibungDas Schlüsselwort finalAbstrakte KlassenRückblick – Mitarbeiterhierarchie7Kapselung
Öffentlich, geschützt, privatZugriffsmodifikatoren im DetailGetter und SetterInformationsverbergungKonstruktor-Promotion (8.0)Wiederholung – System zur Verwaltung von Schülerdatensätzen10Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungDependency InjectionAnonyme KlassenEnums (PHP 8.1)Fibers (PHP 8.1)Objektklonen im DetailGeneratoren & Iteratoren2Namespaces & Autoloading
Einführung in NamespacesDas use-SchlüsselwortPSR-4-Autoloading-StandardComposer-AutoloaderRückblick – Organisiertes Projekt5Schnittstellen & Verträge
Einführung in SchnittstellenSchnittstellen implementierenMehrere Schnittstellen implementierenSchnittstelle vs. abstrakte KlasseTyp-Hinweise mit SchnittstellenRückblick – Formrechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objektklonen__serialize & __unserializeRückblick – Benutzerdefinierte Sammlung11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenBenutzerdefinierte Exception-HierarchieTry, Catch, FinallyRückblick – Formularvalidator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klassen-Eigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenSchreibgeschützte Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphie
Methodenüberschreibung erneut betrachtetPolymorphie über SchnittstellenTyp-Hinweise & Union-TypenSpätes statisches BindenRückblick – Zahlungsabwickler9Traits
Einführung in TraitsMehrere Traits verwendenAuflösung von Trait-KonfliktenAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungÜbe selbstständig: Online-PHP-Compiler