Menu
Coddy logo textTech

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 2

Włó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: hello

Włó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.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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
  • main.php: Dołącz plik TaskRunner. Otrzymasz dwa dane wejściowe: nazwę zadania i wiadomość do przekazania włóknu.

    Utwórz obiekt TaskRunner z podaną nazwą zadania, a następnie użyj createTask(), aby zdefiniować zadanie, które:

    1. Najpierw wstrzymuje się z ciągiem znaków "Waiting for input"
    2. Otrzymuje wartość po wznowieniu
    3. 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.

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

?>
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator PHP online