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 2Fiber, 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: helloFiber'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.
Görev
KolayFiber'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 birTaskRunnersınıfı oluşturun. Sınıf şunları yapmalıdır:- Bir
Fiberörneğini saklamak içinprivatebir özelliğe sahip olmalıdır - Constructor promotion kullanarak kurucusunda bir görev adı (string) kabul etmelidir
- Verilen
callableile yeni bir Fiber oluşturan ve saklayan bircreateTask(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(): 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ı ile bir
TaskRunneroluşturun, ardından şunları yapan bir görev tanımlamak içincreateTask()kullanın:- İlk olarak
"Waiting for input"dizesi ile 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 geçirerek fiber'ı devam ettirin ve nihai sonucu yazdırın.- İlk olarak
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
?>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