Menu
Coddy logo textTech

Fiber'lar (PHP 8.1)

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 60 / 91.

Fiber'lar, kesilebilir kod yürütmesini sağlayan bir PHP 8.1 özelliğidir. Baştan sona kadar çalışan normal fonksiyonların aksine, bir fiber yürütme ortasında kendini duraklatabilir ve duraklatmalar arasında durumunu koruyarak daha sonra tekrar devam edebilir.

Fiber sınıfına bir callable ileterek bir fiber oluşturun, ardından bunu start() ile başlatın:

<?php
$fiber = new Fiber(function(): void {
    echo "Step 1\n";
    Fiber::suspend();
    echo "Step 2\n";
});

$fiber->start();
echo "Between steps\n";
$fiber->resume();

Çıktı:

Step 1
Between steps
Step 2

Fiber, Fiber::suspend() ifadesine ulaşana kadar çalışır, ardından kontrol ana koda geri döner. resume() metodunu çağırmak, yürütmeyi duraklatıldığı yerden devam ettirir.

Fiber'lar askıya alınırken ve devam ettirilirken değer de aktarabilir:

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

Çıktı:

paused
Received: hello

Fiber'lar, asenkron PHP çatılarının temelidir. Birçok uygulamada doğrudan kullanmayacak olsanız da, bunları anlamak HTTP istekleri veya veritabanı sorguları gibi eşzamanlı işlemleri engelleme yapmadan yöneten asenkron kütüphanelerle çalışırken fayda sağlar.

challenge icon

Görev

Kolay

Fiber'ların fiber ile ana kod arasında veri taşırken yürütmeyi nasıl duraklatıp devam ettirebildiğini gösteren bir görev zamanlayıcı inşa edelim. Görevlerin kesintiye uğratılabildiği ve bu sırada diğer işlerin yapılmasına izin veren bir sistem oluşturacaksınız.

Kodunuzu iki dosyada düzenleyeceksiniz:

  • TaskRunner.php — Görevleri çalıştırmak için fiber işlevselliğini sarmalayan bir TaskRunner sınıfı oluşturun. Sınıf şunları yapmalıdır:
    • Bir Fiber örneğini saklamak için private bir özelliğe sahip olmalıdır
    • Constructor promotion kullanarak kurucusunda bir görev adı (string) kabul etmelidir
    • Verilen callable ile yeni bir Fiber oluşturan ve saklayan bir createTask(callable $task) metoduna sahip olmalıdır
    • Fiber'ı başlatan ve fiber'ın ne ile askıya alındığını (veya nihai dönüş değerini) döndüren bir start() metoduna sahip olmalıdır
    • Fiber'ı verilen değer ile devam ettiren ve bir sonraki askıya alınan değeri (veya nihai dönüş değerini) döndüren bir continue(mixed $value) metoduna sahip olmalıdır
    • Fiber'ın sonlanıp sonlanmadığını döndüren bir isFinished(): bool metoduna sahip olmalıdır
  • main.php — TaskRunner dosyasını dahil edin. İki girdi alacaksınız: bir görev adı ve fiber'a gönderilecek bir mesaj.

    Verilen görev adı ile bir TaskRunner oluşturun, ardından şunları yapan bir görev tanımlamak için createTask() kullanın:

    1. İlk olarak "Waiting for input" dizesi ile askıya alınır
    2. Devam ettirildiğinde bir değer alır
    3. "Completed: [received value]" döndürür

    Görevi başlatın ve ilk askıya alındığında döndürdüğü değeri yazdırın. Ardından fiber duraklamaları arasında iş yapıldığını göstermek için "Processing..." yazdırın. Son olarak, mesaj girdisini geçirerek fiber'ı devam ettirin ve nihai sonucu yazdırın.

Bu meydan okuma, fiber'ların işbirlikçi çoklu görevi (cooperative multitasking) nasıl mümkün kıldığını gösterir — göreviniz kendisini uygun bir noktada duraklatır, ana kod diğer işleri yapar, ardından görevi yeni verilerle devam ettirir. Fiber süreç boyunca durumunu korur ve tam olarak kaldığı yerden devam eder.

Kendin dene

<?php

require_once 'TaskRunner.php';

// Girdileri oku
$taskName = trim(fgets(STDIN));
$message = trim(fgets(STDIN));

// TODO: Verilen görev adıyla bir TaskRunner oluştur

// TODO: createTask() kullanarak şu şekilde bir görev tanımla:
// 1. First suspends with the string "Waiting for input"
// 2. Devam ettirildiğinde bir değer alır
// 3. "Completed: [received value]" döndürür

// TODO: Görevi başlat ve ilk askıya alındığında ne döndürdüğünü yazdır

// TODO: Fiber duraklamaları arasında iş olduğunu göstermek için "Processing..." yazdır

// TODO: Mesaj girdisini geçerek fiber'i devam ettir

// TODO: Sonucu yazdır

?>
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler