PHP 8.1 Fiber'ları
Yerleşik Fiber'larla yürütmeyi duraklatın ve sürdürün.
PHP 8.1 Fiber'ları, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.
Fiberlerin Size Sağladıkları
PHP 8.1, çalışan bir çağrı yığınını duraklatıp çok farklı bir yerden daha sonra sürdürmenizi sağlayan temel bir yapı olan fiberleri ekledi. Fiber, istediğiniz bir noktada askıya alabileceğiniz ve yığını geri açmadan sürdürebileceğiniz tam, bağımsız bir yığındır. Bu, kitaplıkların vaat zincirlerini senkron görünümlü await ile değiştirmesini sağlayan eksik parçadır — ReactPHP ve Amp'in modern arayüzlerinin temelindeki özellik budur.
İlk Fiberiniz
Bir geri çağrıyla fiber oluşturun, start() ile başlatın ve kendi kendisini suspend() etmesine izin verin. Denetim askıya alma noktasında çağırana geri döner; resume() tam olarak o noktadan devam eder.
<?php
$fiber = new Fiber(function (): void {
echo "A: inside fiber\n";
$received = Fiber::suspend('paused');
echo "C: resumed with '$received'\n";
});
$value = $fiber->start(); // prints A, returns 'paused'
echo "B: fiber suspended, got '$value'\n";
$fiber->resume('hello'); // prints C
echo "D: fiber done\n";Dört Temel Yöntem
Arayüz küçüktür:
$fiber->start(...$args)— yürütmeyi başlatır; ilk askıya alma değerini döndürür.Fiber::suspend($value)— geçerli fiberi duraklatır ve$valuedeğerini fiberi sürdürene verir.$fiber->resume($value)— devam eder;$value,suspend()işlevinin dönüş değeri olur.$fiber->getReturn()— sonlandırıldıktan sonra geri çağrının döndürdüğü değerdir.
Değerler askıya alma sınırından iki yönde de geçer.
Çift Yönlü Değer Aktarımı
Bir fiber dışarıya bir istek gönderip karşılığında içeriye bir yanıt alabilir — bir olay döngüsünün G/Ç sonuçlarını askıya alınmış görevlere iletme biçiminin temelinde bu vardır.
<?php
$fiber = new Fiber(function (): int {
$a = Fiber::suspend('need first number');
$b = Fiber::suspend('need second number');
return $a + $b;
});
$fiber->start(); // suspends: 'need first number'
$fiber->resume(10); // a = 10, suspends: 'need second number'
$fiber->resume(32); // b = 32, fiber returns
echo $fiber->getReturn(), PHP_EOL; // 42Fiber Durumu ve İnceleme
Bir fiberin yaşam döngüsü hakkında bilgi alabilirsiniz. Sonlandırılmış bir fiber üzerinde resume() çağırmak FiberError oluşturur; bu nedenle bir görev zamanlayıcısı oluştururken bu denetimlerle koruma sağlayın.
<?php
$fiber = new Fiber(function () { Fiber::suspend(); });
var_dump($fiber->isStarted()); // false
$fiber->start();
var_dump($fiber->isStarted()); // true
var_dump($fiber->isSuspended()); // true
var_dump($fiber->isRunning()); // false (we're outside it)
$fiber->resume();
var_dump($fiber->isTerminated()); // trueKüçük Bir Zamanlayıcı Oluşturma
Fiberler ile bir kuyruğun birleşimi, işbirlikli bir zamanlayıcı oluşturur. Her görev denetimi bırakmak için askıya alınır; zamanlayıcı tüm görevler tamamlanana kadar sırayla ilerler. Her asenkron çalışma zamanının içindeki iskelet budur.
<?php
$tasks = [];
foreach (['X', 'Y', 'Z'] as $name) {
$tasks[] = new Fiber(function () use ($name) {
for ($i = 1; $i <= 2; $i++) {
echo "$name step $i\n";
Fiber::suspend(); // give others a turn
}
});
}
foreach ($tasks as $t) { $t->start(); }
while ($tasks) {
foreach ($tasks as $k => $t) {
if ($t->isTerminated()) { unset($tasks[$k]); continue; }
$t->resume();
}
}Sınırlar Arasında Özel Durumlar
throwInto() (arayüzde $fiber->throw() olarak çağrılan throw()), askıya alma noktasına bir özel durum yerleştirir — bir döngünün başarısız bir G/Ç işlemini bekleyen göreve geri bildirme biçimi budur. Özel durum, fiberin duraklatıldığı yerde ortaya çıkar.
<?php
$fiber = new Fiber(function () {
try {
Fiber::suspend();
} catch (RuntimeException $e) {
echo 'caught: ' . $e->getMessage() . PHP_EOL;
}
});
$fiber->start();
$fiber->throw(new RuntimeException('io failed')); // prints: caught: io failedFiberler ve Üreteçler
Üreteçler (yield) de askıya alınabilir — ancak yalnızca en üstteki işlevi askıya alırlar. Üreteçlerle iç içe bir yardımcı işlevden beklemek için yığının tamamı boyunca yield from kullanmanız ve her işlevi bu yapıya bağımlı hâle getirmeniz gerekir. Fiberler tüm yığını askıya alır; bu nedenle derinlerdeki bir çağrı, çağıranlarının bundan haberi olmadan Fiber::suspend() kullanabilir. Bu yüzden await, yield yerine sıradan bir işlev çağrısı olabilir.
<?php
function deep(): string {
// No yield needed in the call chain — suspends the whole fiber
return Fiber::suspend('awaiting from deep');
}
$f = new Fiber(fn() => print(deep() . PHP_EOL));
$f->start();
$f->resume('value injected at depth');Askıya Alma Kısıtlaması
Kesin bir kural vardır: Fiber::suspend() işlevini yalnızca bir fiberin içinden çağırabilirsiniz. Ana iş parçacığından veya fiberleri desteklemeyen bir C düzeyi geri çağrı üzerinden askıya alma (bazı eski usort karşılaştırıcıları ve belirli dahili geri çağrılar), FiberError: Cannot suspend outside of a fiber oluşturur. Kitaplıklar, tüm kullanıcı kodunun döngü tarafından çalıştırılan bir fiberin içinde yürütülmesini sağlayarak bu ayrıntıyı gizler.
<?php
try {
Fiber::suspend(); // main thread — illegal
} catch (FiberError $e) {
echo $e->getMessage(), PHP_EOL; // Cannot suspend outside of a fiber
}Kitaplıklar Fiberleri Nasıl Kullanır
Uygulama kodunda ham fiberleri nadiren yazarsınız. Amp v3 ve ReactPHP (fiberler aracılığıyla) gibi çerçeveler bunları sarar: await($promise) dahili olarak Fiber::suspend() çağırır, olay döngüsüne bir devam işlemi kaydeder ve G/Ç tamamlandığında fiberinizi resume() ile sürdürür. Kodunuz senkron görünür; çalışma zamanı beklemeye alma ve zamanlamayı yönetir.
<?php
// Conceptual: what an await() helper does under the hood
function await(Promise $p): mixed {
$fiber = Fiber::getCurrent() ?? throw new Error('await() outside fiber');
$p->then(fn($v) => $fiber->resume($v),
fn($e) => $fiber->throw($e));
return Fiber::suspend(); // parked until the promise settles
}Bellek ve Yaşam Döngüsüyle İlgili Uyarılar
Her fiber kendi yığınını ayırır; bu nedenle yüz binlerce fiber oluşturmanın bir bellek maliyeti vardır (yine de OS iş parçacıklarından çok daha hafiftir). Bir fiber hâlâ bir şey tarafından referanslanıyorsa sonsuza kadar askıda kalmış bir fiber çöp toplayıcı tarafından geri alınmaz; bu, uzun süre çalışan sunucularda fark edilmesi zor bir sızıntıdır. Ayrıca fiberin geri çağrısı bir yakalanmamış özel durum oluşturursa bu özel durum resume()/start() çağrısının dışına yayılır; bu nedenle zamanlayıcı, sürdürme işlemlerini deneme/yakalama ile sarmalamalıdır.
<?php
$fiber = new Fiber(function () {
throw new RuntimeException('boom inside fiber');
});
try {
$fiber->start(); // exception surfaces here, at the resumer
} catch (RuntimeException $e) {
echo 'scheduler caught: ' . $e->getMessage() . PHP_EOL;
}Hızlı Kontrol
Fiberlerin asenkron programlama açısından üreteçlere göre temel avantajı nedir?
Özet
Fiberler, PHP'nin düşük düzeyli eşzamanlılık temel yapısıdır:
start(),Fiber::suspend(),resume(),getReturn()tam bir çağrı yığınını duraklatıp sürdürür ve değerleri iki yönde de aktarır.- Durum yöntemleri (
isSuspended,isTerminated) vethrow(), işbirlikli bir zamanlayıcı oluşturmanıza ve G/Ç hatalarını yerleştirmenize olanak tanır. - Üreteçlerden farklı olarak fiber, herhangi bir derinlikten askıya alınabilir; bu sayede saydam bir
await()kullanılabilir. - Yalnızca bir fiberin içinde askıya alınabilirsiniz; Amp ve ReactPHP gibi çerçeveler fiberleri sararak asenkron kodunuzun senkron okunmasını sağlar.
Sıkça Sorulan Sorular
“PHP 8.1 Fiber'ları” dersi ücretsiz mi?
Evet — “PHP 8.1 Fiber'ları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.
“PHP 8.1 Fiber'ları” dersinde ne öğreneceğim?
Yerleşik Fiber'larla yürütmeyi duraklatın ve sürdürün. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
PHP Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“PHP 8.1 Fiber'ları” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- PHP Eşzamanlılık Modeli
- PHP 8.1 Fiber'ları
- ReactPHP ile Olay Döngüleri
- Swoole ile Yüksek Performanslı Sunucular