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, kesintiye uğratılabilir kod yürütmeyi sağlayan bir PHP 8.1 özelliğidir. Baştan sona çalışan normal fonksiyonların aksine, bir fiber yürütme sırasında kendini duraklatabilir ve duraklamalar arasında durumunu koruyarak daha sonra devam edebilir.

Fiber sınıfına bir çağrılabilir (callable) geçirerek bir fiber oluşturun, ardından 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 döner. resume() metodunun çağrılması, yürütmeyi duraklatıldığı yerden devam ettirir.

Fiber'lar askıya alınırken ve devam ettirilirken de değerler iletebilir:

<?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 framework'lerinin temelidir. Çoğu uygulamada onları doğrudan kullanmayacak olsanız da, bunları anlamak, HTTP istekleri veya veritabanı sorguları gibi eşzamanlı işlemleri bloklama yapmadan yöneten asenkron kütüphanelerle çalışırken yardımcı olur.

challenge icon

Görev

Kolay

Fiber'ların, fiber ile ana kod arasında veri aktarımı yaparken yürütmeyi nasıl duraklatıp devam ettirebildiğini gösteren bir görev zamanlayıcı oluşturalım. Görevlerin kesintiye uğrayabildiği ve bu arada başka işlerin yapılmasına olanak tanıyan bir sistem oluşturacaksınız.

Kodunuzu iki dosya halinde 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 özel (private) bir özelliğe sahip olmalıdır
    • Yapıcı metodunda (constructor) "constructor promotion" kullanarak bir görev adı (string) kabul etmelidir
    • Verilen çağrılabilir (callable) ile yeni bir Fiber oluşturan ve bunu saklayan bir createTask(callable $task) metoduna sahip olmalıdır
    • Fiber'ı başlatan ve fiber'ın askıya alındığı (suspend) değeri (veya nihai dönüş değerini) döndüren bir start() metoduna sahip olmalıdır
    • Fiber'ı verilen değerle 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ıyla bir TaskRunner oluşturun, ardından şu işlemleri yapan bir görev tanımlamak için createTask() metodunu kullanın:

    1. Önce "Waiting for input" dizesiyle 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 ileterek fiber'ı devam ettirin ve nihai sonucu yazdırın.

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

Kopya kağıdı

Fiber'lar, PHP 8.1+ sürümünde kesintiye uğratılabilir kod yürütülmesini sağlar. Normal fonksiyonların aksine, bir fiber yürütme sırasında duraklayabilir ve durumunu koruyarak daha sonra devam edebilir.

Fiber sınıfına çağrılabilir (callable) bir yapı geçirerek bir fiber oluşturun ve onu 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();

Fiber, Fiber::suspend() çağrısına kadar çalışır, ardından kontrol ana koda döner. Kaldığı yerden yürütmeye devam etmek için resume() metodunu çağırın.

Fiber'lar duraklatılırken ve devam ettirilirken değer aktarabilirler:

<?php
$fiber = new Fiber(function(): string {
    $value = Fiber::suspend("paused");
    return "Received: $value";
});

$suspended = $fiber->start();
$result = $fiber->resume("hello");

Temel metodlar:

  • start() — fiber yürütmesini başlatır
  • Fiber::suspend($value) — yürütmeyi duraklatır ve çağırana bir değer döndürür
  • resume($value) — yürütmeye devam eder ve fiber'a bir değer iletir
  • isTerminated() — fiber'ın sonlanıp sonlanmadığını kontrol 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şturun

// TODO: Aşağıdakileri yapan bir görev tanımlamak için createTask() kullanın:
// 1. Önce "Waiting for input" dizesiyle askıya alınır
// 2. Devam ettirildiğinde bir değer alır
// 3. "Completed: [received value]" döndürür

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

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

// TODO: Mesaj girdisini ileterek fiber'ı devam ettirin

// TODO: Nihai sonucu yazdırın

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