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 2Fiber, 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: helloFiber'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.
Görev
KolayFiber'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 birTaskRunnersı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(): boolmetoduna sahip olmalı
- Bir
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
TaskRunneroluştur, ardından şunları yapan bir görev tanımlamak içincreateTask()metodunu kullan:- Önce
"Waiting for input"dizesiyle duraklar - Sürdürüldüğünde bir değer alır
"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.- Önce
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
?>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 SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarı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ıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi