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 2Fiber, 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: helloFiber'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.
Görev
KolayFiber'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 birTaskRunnersı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(): boolmetoduna sahip olmalıdır
- Bir
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
TaskRunneroluşturun, ardından şu işlemleri yapan bir görev tanımlamak içincreateTask()metodunu kullanın:- Önce
"Waiting for input"dizesiyle askıya alınır - Devam ettirildiğinde bir değer alır
"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.- Önce
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ırFiber::suspend($value)— yürütmeyi duraklatır ve çağırana bir değer döndürürresume($value)— yürütmeye devam eder ve fiber'a bir değer iletirisTerminated()— 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
?>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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar KelimesiMetotlarÖzelliklerYapıcı Metot (__construct)Yıkıcı Metot (__destruct)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar KelimesiMetot Geçersiz Kılmafinal Anahtar KelimesiSoyut SınıflarÖzet - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicilere Derinlemesine BakışGetter ve Setter MetotlarıBilgi GizlemeConstructor Promotion (8.0)Özet - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımDependency InjectionAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlama: Derinlemesine İncelemeGenerator'lar ve Iterator'lar13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı2İsim Alanları ve Autoloading
İsim Alanlarına Girişuse Anahtar KelimesiPSR-4 Autoloading StandartıComposer AutoloaderÖzet - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Fazla Arayüz UygulamaArayüz vs Soyut SınıfArayüzler ile Tip BelirlemeÖzet - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Nesne Klonlama__serialize & __unserializeÖzet - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerReadonly Özellikler (PHP 8.1)Özet - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmaya Yeniden BakışArayüzler ile Çok BiçimlilikType Hinting ve Union TypesLate Static BindingÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişÇoklu Trait KullanımıTrait Çakışma ÇözümüTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım12Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı15Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi