Menu
Coddy logo textTech

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 2

Der 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: hello

Fibers 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.

challenge icon

Aufgabe

Einfach

Lassen 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 eine TaskRunner-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(): bool besitzen, die zurückgibt, ob die Fiber beendet wurde
  • 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 TaskRunner mit dem angegebenen Aufgabennamen und verwenden Sie dann createTask(), um eine Aufgabe zu definieren, die:

    1. Zuerst mit dem String "Waiting for input" suspendiert
    2. Einen Wert erhält, wenn sie fortgesetzt wird
    3. "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.

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ührung
  • Fiber::suspend($value) — pausiert die Ausführung und gibt einen Wert an den Aufrufer zurück
  • resume($value) — setzt die Ausführung fort und übergibt einen Wert an den Fiber
  • isTerminated() — 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

?>
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung