Włókna (PHP 8.1)
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 60 z 91.
Włókna to funkcja PHP 8.1, która umożliwia przerywanie wykonywania kodu. W przeciwieństwie do zwykłych funkcji, które działają od początku do końca, włókno może wstrzymać działanie w trakcie wykonywania i wznowić je później, zachowując swój stan między wstrzymaniami.
Utwórz włókno, przekazując obiekt wywoływalny do klasy Fiber, a następnie uruchom je za pomocą 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();
Wynik:
Step 1
Between steps
Step 2Włókno działa, aż napotka Fiber::suspend(), po czym sterowanie wraca do głównego kodu. Wywołanie resume() wznawia wykonywanie od miejsca, w którym zostało wstrzymane.
Włókna mogą również przekazywać wartości podczas zawieszania i wznawiania:
<?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;
Wynik:
paused
Received: helloWłókna stanowią podstawę asynchronicznych frameworków PHP. Chociaż w większości aplikacji nie będziesz używać ich bezpośrednio, ich zrozumienie pomaga w pracy z bibliotekami asynchronicznymi, które obsługują współbieżne operacje, takie jak żądania HTTP lub zapytania do bazy danych, bez blokowania.
Wyzwanie
ŁatwyZbudujmy planistę zadań, który pokazuje, jak włókna mogą wstrzymywać i wznawiać wykonywanie, przekazując dane między włóknem a głównym kodem. Utworzysz system, w którym zadania można przerywać, aby w międzyczasie można było wykonywać inne działania.
Rozmieścisz swój kod w dwóch plikach:
TaskRunner.php: Utwórz klasęTaskRunner, która opakowuje funkcjonalność włókien do uruchamiania zadań. Klasa powinna:- Mieć prywatną właściwość do przechowywania instancji
Fiber - Przyjmować nazwę zadania (string) w konstruktorze, używając promocji właściwości konstruktora
- Mieć metodę
createTask(callable $task), która tworzy nowe włókno z podaną funkcją wywoływalną i je zapisuje - Mieć metodę
start(), która uruchamia włókno i zwraca wartość, z którą włókno się wstrzymuje (lub końcową wartość zwracaną) - Mieć metodę
continue(mixed $value), która wznawia włókno z podaną wartością i zwraca kolejną wstrzymaną wartość (lub końcową wartość zwracaną) - Mieć metodę
isFinished(): bool, która zwraca informację, czy włókno zostało zakończone
- Mieć prywatną właściwość do przechowywania instancji
main.php: Dołącz plik TaskRunner. Otrzymasz dwa dane wejściowe: nazwę zadania i wiadomość do przekazania włóknu.Utwórz obiekt
TaskRunnerz podaną nazwą zadania, a następnie użyjcreateTask(), aby zdefiniować zadanie, które:- Najpierw wstrzymuje się z ciągiem znaków
"Waiting for input" - Otrzymuje wartość po wznowieniu
- Zwraca
"Completed: [received value]"
Uruchom zadanie i wypisz wartość zwróconą przy pierwszym wstrzymaniu. Następnie wypisz
"Processing...", aby pokazać, że między wstrzymaniami włókna wykonywana jest inna praca. Na koniec wznów włókno, przekazując mu wiadomość z danych wejściowych, i wypisz końcowy wynik.- Najpierw wstrzymuje się z ciągiem znaków
To wyzwanie pokazuje, jak włókna umożliwiają wielozadaniowość kooperacyjną. Zadanie wstrzymuje się w dogodnym momencie, główny kod wykonuje inne działania, a następnie wznawia zadanie z nowymi danymi. Włókno zachowuje swój stan przez cały czas i kontynuuje dokładnie od miejsca, w którym zostało wstrzymane.
Spróbuj swoich sił
<?php
require_once 'TaskRunner.php';
// Odczytaj dane wejściowe
$taskName = trim(fgets(STDIN));
$message = trim(fgets(STDIN));
// TODO: Utwórz TaskRunner o podanej nazwie zadania
// TODO: Użyj createTask(), aby zdefiniować zadanie, które:
// 1. Najpierw wstrzymuje się, zwracając ciąg "Waiting for input"
// 2. Otrzymuje wartość po wznowieniu
// 3. Zwraca "Completed: [received value]"
// TODO: Uruchom zadanie i wypisz to, co zwraca przy pierwszym wstrzymaniu
// TODO: Wypisz "Processing...", aby pokazać, że między wstrzymaniami włókna wykonywana jest praca
// TODO: Wznów włókno, przekazując mu wiadomość z danych wejściowych
// TODO: Wypisz wynik końcowy
?>Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe $thisMetodyWłaściwościKonstruktor (__construct)Destruktor (__destruct)Powtórka — prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe parent::Przesłanianie metodSłowo kluczowe finalKlasy abstrakcyjnePowtórzenie – hierarchia pracowników7Enkapsulacja
Public, protected, privateModyfikatory dostępu w szczegółachGettery i setteryUkrywanie informacjiPromocja parametrów konstruktora (8.0)Podsumowanie — system ewidencji studentów10Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieWstrzykiwanie zależnościKlasy anonimoweEnumy (PHP 8.1)Włókna (PHP 8.1)Dogłębne omówienie klonowania obiektówGeneratory i iteratory2Przestrzenie nazw i autoloading
Wprowadzenie do przestrzeni nazwSłowo kluczowe useStandard autoloadingu PSR-4Autoloader ComposeraPodsumowanie – uporządkowany projekt5Interfejsy i kontrakty
Wprowadzenie do interfejsówImplementowanie interfejsówImplementowanie wielu interfejsówInterfejs a klasa abstrakcyjnaPodpowiadanie typów za pomocą interfejsówPodsumowanie — kalkulator kształtów8Metody magiczne
Wprowadzenie do metod magicznych__toString i __debugInfo__get, __set, __isset, __unset__call i __callStatic__clone i klonowanie obiektów__serialize i __unserializePodsumowanie — własna kolekcja11System typów i obsługa błędów
Deklaracje typówTypy nullableTypy sumy i przecięciaKlasy wyjątkówNiestandardowa hierarchia wyjątkówTry, Catch, FinallyPodsumowanie — walidator formularzy14Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Właściwości klas
Właściwości instancji a właściwości statyczneStałe w klasachMetody i właściwości statyczneWłaściwości prywatne i chronioneWłaściwości tylko do odczytu (PHP 8.1)Podsumowanie — menedżer kont bankowych6Polimorfizm
Ponowne omówienie nadpisywania metodPolimorfizm za pomocą interfejsówPodpowiedzi typów i typy sumyPóźne wiązanie statycznePodsumowanie — procesor płatności9Cechy
Wprowadzenie do cechKorzystanie z wielu cechRozwiązywanie konfliktów cechMetody abstrakcyjne w cechachCechy a dziedziczenie12Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator PHP online