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 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 2

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

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

challenge icon

Aufgabe

Einfach

Erstelle 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 eine TaskRunner-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(): bool besitzen, die zurückgibt, ob die Faser beendet wurde
  • 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 TaskRunner mit dem angegebenen Task-Namen und verwende dann createTask(), um einen Task zu definieren, der:

    1. zuerst mit dem String "Waiting for input" pausiert
    2. beim Fortsetzen einen Wert empfängt
    3. "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.

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

?>
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

Übe selbstständig: Online-PHP-Compiler