Menu
Coddy logo textTech

Fibers (PHP 8.1)

Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 60 di 91.

Le fiber sono una funzionalità di PHP 8.1 che consente l'esecuzione interrompibile del codice. A differenza delle normali funzioni, che vengono eseguite dall'inizio alla fine, una fiber può sospendersi a metà dell'esecuzione e riprenderla in seguito, mantenendo il proprio stato tra una sospensione e l'altra.

Crea una fibra passando un callable alla classe Fiber, quindi avviala con 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();

Output:

Step 1
Between steps
Step 2

La fibra viene eseguita finché non incontra Fiber::suspend(), poi il controllo torna al codice principale. Chiamando resume() l'esecuzione riprende da dove si era interrotta.

Le fiber possono anche passare valori durante la sospensione e la ripresa:

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

Output:

paused
Received: hello

Le fiber sono la base dei framework PHP asincroni. Anche se non le userai direttamente nella maggior parte delle applicazioni, capirle ti aiuta a lavorare con librerie asincrone che gestiscono operazioni concorrenti come richieste HTTP o query al database senza bloccare.

challenge icon

Sfida

Facile

Costruiamo uno scheduler di attività che mostri come le fibre possano sospendere e riprendere l'esecuzione passando dati tra la fibra e il codice principale. Creerai un sistema in cui le attività possono essere interrotte, permettendo di svolgere altro lavoro nel frattempo.

Organizzerai il codice in due file:

  • TaskRunner.php: crea una classe TaskRunner che racchiuda le funzionalità delle fibre per eseguire attività. La classe dovrebbe:
    • Avere una proprietà privata in cui memorizzare un'istanza di Fiber
    • Accettare un nome dell'attività (stringa) nel costruttore usando la promozione del costruttore
    • Avere un metodo createTask(callable $task) che crea una nuova Fiber con il callable specificato e la memorizza
    • Avere un metodo start() che avvia la fibra e restituisce il valore con cui la fibra si sospende (oppure il valore restituito alla fine)
    • Avere un metodo continue(mixed $value) che riprende la fibra con il valore specificato e restituisce il valore della sospensione successiva (oppure il valore restituito alla fine)
    • Avere un metodo isFinished(): bool che restituisce se la fibra è terminata
  • main.php: includi il file TaskRunner. Riceverai due input: un nome dell'attività e un messaggio da inviare alla fibra.

    Crea un TaskRunner con il nome dell'attività specificato, quindi usa createTask() per definire un'attività che:

    1. Per prima cosa si sospende con la stringa "Waiting for input"
    2. Riceve un valore quando viene ripresa
    3. Restituisce "Completed: [received value]"

    Avvia l'attività e stampa ciò che restituisce quando si sospende per la prima volta. Poi stampa "Processing..." per mostrare che nel frattempo viene svolto del lavoro tra le sospensioni della fibra. Infine, riprendi la fibra passandole il messaggio di input e stampa il risultato finale.

Questa sfida mostra come le fibre consentano il multitasking cooperativo. La tua attività si sospende in un punto opportuno, il codice principale svolge altro lavoro, poi l'attività riprende con nuovi dati. La fibra mantiene il proprio stato per tutto il tempo, riprendendo esattamente da dove si era interrotta.

Provalo tu

<?php

require_once 'TaskRunner.php';

// Leggi gli input
$taskName = trim(fgets(STDIN));
$message = trim(fgets(STDIN));

// TODO: Crea un TaskRunner con il nome dell'attività specificato

// TODO: Usa createTask() per definire un'attività che:
// 1. Per prima cosa si sospende con la stringa "Waiting for input"
// 2. Riceve un valore quando viene ripresa
// 3. Restituisce "Completed: [received value]"

// TODO: Avvia l'attività e stampa ciò che restituisce alla prima sospensione

// TODO: Stampa "Processing..." per mostrare che viene svolto del lavoro tra le pause della fiber

// TODO: Riprendi la fiber passando l'input message

// TODO: Stampa il risultato finale

?>
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore PHP online