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 2La 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: helloLe 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.
Sfida
FacileCostruiamo 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 classeTaskRunnerche 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(): boolche restituisce se la fibra è terminata
- Avere una proprietà privata in cui memorizzare un'istanza di
main.php: includi il file TaskRunner. Riceverai due input: un nome dell'attività e un messaggio da inviare alla fibra.Crea un
TaskRunnercon il nome dell'attività specificato, quindi usacreateTask()per definire un'attività che:- Per prima cosa si sospende con la stringa
"Waiting for input" - Riceve un valore quando viene ripresa
- 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.- Per prima cosa si sospende con la stringa
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
?>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
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave $thisMetodiProprietàCostruttore (__construct)Distruttore (__destruct)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa parola chiave parent::Sovrascrittura dei metodiLa parola chiave finalClassi astratteRiepilogo - Gerarchia dei dipendenti7Incapsulamento
Pubblico, Protetto, PrivatoApprofondimento sui modificatori di accessoGetter e SetterOccultamento delle informazioniPromozione dei parametri del costruttore (8.0)Riepilogo - Sistema di gestione dei registri degli studenti10Concetti avanzati di programmazione a oggetti
Composizione vs ereditarietàDependency InjectionClassi anonimeEnumerazioni (PHP 8.1)Fibers (PHP 8.1)Approfondimento sulla clonazione degli oggettiGeneratori e iteratori13Modelli di progettazione, parte 2
Modello CommandModello AdapterModello DecoratorModello Template MethodModello StateModello CompositeModello Repository2Namespace e autoloading
Introduzione ai namespaceLa keyword useStandard di autoloading PSR-4Autoloader di ComposerRiepilogo - Progetto organizzato5Interfacce e contratti
Introduzione alle interfacceImplementare le interfacceImplementare più interfacceInterfaccia vs classe astrattaType hinting con le interfacceRiepilogo - Calcolatore di forme8Metodi magici
Introduzione ai metodi magici__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e clonazione degli oggetti__serialize e __unserializeRiepilogo - Collezione personalizzata11Sistema dei tipi e gestione degli errori
Dichiarazioni di tipoTipi nullableTipi unione e intersezioneClassi di eccezioneGerarchia di eccezioni personalizzataTry, Catch, FinallyRiepilogo - Validatore di moduli14Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Proprietà delle classi
Proprietà di istanza e staticheCostanti nelle classiMetodi e proprietà staticiProprietà private e protectedProprietà readonly (PHP 8.1)Riepilogo - Gestore di conti bancari6Polimorfismo
Ridefinizione dei metodi, ripresaPolimorfismo tramite interfacceSuggerimenti sui tipi e tipi UnionBinding statico tardivoRiepilogo - Processore di pagamenti9Tratti
Introduzione ai trattiUtilizzare più trattiRisoluzione dei conflitti tra trattiMetodi astratti nei trattiTratti vs ereditarietà12Design pattern - Parte 1
Introduzione ai design patternPattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore PHP online