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 mümkün kılan bir PHP 8.1 özelliğidir. Baştan sona çalışan normal işlevlerin aksine, bir fiber yürütmenin ortasında kendisini duraklatabilir ve duraklamalar arasındaki durumunu koruyarak daha sonra devam edebilir.

Bir çağrılabilir öğeyi Fiber sınıfına 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() çağrısına ulaşana kadar çalışır, ardından denetim ana koda geri döner. resume() çağrısı, yürütmeyi durakladığı yerden sürdürür.

Fiber'lar askıya alınırken ve devam ettirilirken değerleri de 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, eşzamansız PHP framework'lerinin temelini oluşturur. Çoğu uygulamada bunları doğrudan kullanmayacak olsan da, engelleme yapmadan HTTP istekleri veya veritabanı sorguları gibi eşzamanlı işlemleri yöneten eşzamansız kütüphanelerle çalışırken fiber'ları anlamak yardımcı olur.

challenge icon

Görev

Kolay

Fiber'ların, fiber ile ana kod arasında veri aktarırken yürütmeyi nasıl duraklatıp sürdürebildiğini gösteren bir görev zamanlayıcı oluşturalım. Görevlerin kesintiye uğratılabildiği ve bu arada başka işlerin yapılabildiği bir sistem oluşturacaksın.

Kodunu iki dosya arasında düzenleyeceksin:

  • TaskRunner.php: Görevleri çalıştırmak için fiber işlevselliğini saran bir TaskRunner sınıfı oluştur:
    • Bir Fiber örneğini saklamak için private bir özelliğe sahip olmalı
    • Yapıcı işlev tanıtımını kullanarak yapıcısında bir görev adı (string) kabul etmeli
    • Verilen callable ile yeni bir Fiber oluşturan ve onu saklayan createTask(callable $task) metoduna sahip olmalı
    • Fiber'ı başlatan ve fiber'ın durakladığı değeri (veya son dönüş değerini) döndüren start() metoduna sahip olmalı
    • Fiber'ı verilen değerle sürdüren ve bir sonraki duraklatılmış değeri (veya son dönüş değerini) döndüren continue(mixed $value) metoduna sahip olmalı
    • Fiber'ın sonlanıp sonlanmadığını döndüren isFinished(): bool metoduna sahip olmalı
  • main.php: TaskRunner dosyasını dahil et. İki girdi alacaksın: bir görev adı ve fiber'a gönderilecek bir mesaj.

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

    1. Önce "Waiting for input" dizesiyle duraklar
    2. Sürdürüldüğünde bir değer alır
    3. "Completed: [received value]" değerini döndürür

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

Bu uygulama, fiber'ların işbirlikçi çoklu görevlendirmeyi nasıl etkinleştirdiğini gösterir. Görevin uygun bir noktada kendisini duraklatır, ana kod başka işler yapar, ardından görevi yeni verilerle sürdürür. Fiber, süreç boyunca durumunu korur ve kaldığı yerden tam olarak 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 şöyle 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 döndürdüğünü yazdır

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

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

// TODO: Nihai 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

Kendi başına pratik yap: Online PHP derleyicisi