Fiberlere giriş
(PHP 8 >= 8.1.0)
Fiberler, tamamen yığıtlanabilen ve yürütmeyi kesintiye uğratılabilen
işlevlerdir. Fiberin çağrı yığıtının herhangi bir yerinde askıya alınmasıyla
yürütmenin bekletilmesi ve daha sonra fiberin yürütmeyi kaldığı yerden devam
ettirmesi sağlanabilir.
Fiberler icra yığıtınını tamamını bekletebilir, böylece işlevin davranışını
değiştirmek için işlevin doğrudan çağrılması gerekmez.
Fiber::suspend() çağrısı ile çağrı yığıtının
herhangi bir yerinde yürütme kesintiye uğratılabilir (yani,
Fiber::suspend() oldukça iç içe çağrıların
derinlerinde yer alabileceği gibi hiçbir yerde de var olmayabilir).
Yığıtsız üreteçlerin (Generator) tersine, her
Fiber sınıfının kendi çağrı yığıtı vardır. Böylece,
oldukça iç içe işlev çağrılarında bile bekletme sağlanabilmektedir. Bir
kesinti noktası belirten bir işlev (yani,
Fiber::suspend() çağrısı),
Fiber::suspend() dönüş türünün değiştirilmemesini
gerektirir (bir Generator örneğinden dönen yield
deyimini kullanan bir işlevin tersine).
Fiberler PHP VM içinden çağrılanlar dahil, array_map()
işlevine sağlanan işlevler veya Iterator nesnesi
üzerinde foreach ile çağrılan yöntemler gibi, herhangi bir işlev çağrısını
askıya alabilir.
Bir kere askıya alınınca, Fiber::resume() işlevi
herhangi bir değerle çağrılarak veya Fiber::throw()
kullanarak fiber içinde bir istisna yavrulatarak, fiber yürütmesi kaldığı
yerden devam ettirilebilir. Değer, Fiber::suspend()
yönteminden veya yavrulanan istisnadan döndürülür.
Örnek 1 - Temel kullanım örneği
<?php
$fiber = new Fiber(function (): void {
$value = Fiber::suspend('fiber');
echo "Fiberi devam ettirmekte kullanılan değer: ", $value, PHP_EOL;
});
$value = $fiber->start();
echo "Fiber askıya alındığındaki değer: ", $value, PHP_EOL;
$fiber->resume('test');
?>
Yukarıdaki örneğin çıktısı:
Fiber askıya alınırken kullanılan değer: fiber
Fiberi devam ettirmekte kullanılan değer: test