ReactPHP ile Olay Döngüleri
ReactPHP olay döngüsüyle engellemesiz G/Ç çalıştırın.
ReactPHP ile Olay Döngüleri, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 3. 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.
ReactPHP Tek Cümlede
ReactPHP, tek bir olay döngüsü etrafında oluşturulmuş, yalnızca PHP'den oluşan ve bağımlılık içermeyen, engellemeyen G/Ç için bir araç setidir. Uzantı gerekmez — standart PHP üzerinde stream_select (veya kullanılabilir olduğunda ext-event/ext-ev) kullanarak çalışır. Bununla düz PHP kullanarak uzun süre çalışan sunucular, paralel HTTP istemcileri ve akış işlem hatları yazabilirsiniz.
Genel Olay Döngüsü
Modern ReactPHP (v1.2+), statik React\EventLoop\Loop görünümü aracılığıyla varsayılan bir döngü sunar; her yerde bir döngü örneği geçirmeniz gerekmez. Bir zamanlayıcıyla geri çağrı planlayın; döngü, yapacak başka iş kalmayana kadar çalışır.
<?php
require 'vendor/autoload.php';
use React\EventLoop\Loop;
Loop::addTimer(1.0, function () {
echo "fired after 1 second\n";
});
echo "scheduled\n";
// Loop::run() is auto-invoked at script shutdown in v1.2+Zamanlayıcılar ve Periyodik İşler
Engellemeyen zamanlama, sleep() işlevinin yerini alır. addTimer bir kez çalışır; addPeriodicTimer yinelenir. Durmaları için ikisini de iptal edebilirsiniz. Bunlar döngü tarafından yönetildiği için zamanlayıcı beklerken diğer görevler çalışmaya devam eder.
<?php
use React\EventLoop\Loop;
$count = 0;
$timer = Loop::addPeriodicTimer(0.5, function () use (&$count, &$timer) {
echo 'tick ' . (++$count) . "\n";
if ($count === 4) {
Loop::cancelTimer($timer); // stop after 4 ticks
}
});Asenkron Sonuçlar İçin Vaatler
ReactPHP, daha sonra tamamlanan her işlem için bir vaat döndürür. Başarı için then() ekleyin ve başarısızlık için ikinci bir geri çağrı kullanın. Vaatler birleştirilebilir; böylece geri çağrıları derinlemesine iç içe yerleştirmeden sonuçları dönüştürebilir ve zincirleyebilirsiniz.
<?php
use React\Promise\Promise;
function asyncDouble(int $n): Promise {
return new Promise(function ($resolve) use ($n) {
\React\EventLoop\Loop::addTimer(0.1, fn() => $resolve($n * 2));
});
}
asyncDouble(21)
->then(fn($r) => printf("result: %d\n", $r)) // 42
->catch(fn(\Throwable $e) => printf("err: %s\n", $e->getMessage()));Asenkron İstemciyle Paralel HTTP
En büyük kazanım şudur: tek bir iş parçacığından çok sayıda HTTP isteğini eşzamanlı olarak başlatabilirsiniz. React\Http\Browser vaatler döndürür; React\Promise\all() toplu işlemin tamamını bekler. Bir saniyelik on istek yaklaşık 1 saniyede, 10 saniyede değil, tamamlanır.
<?php
use React\Http\Browser;
use function React\Promise\all;
$browser = new Browser();
$urls = [
'https://httpbin.org/delay/1',
'https://httpbin.org/delay/1',
'https://httpbin.org/delay/1',
];
$requests = array_map(fn($u) => $browser->get($u), $urls);
all($requests)->then(function (array $responses) {
echo 'all done: ' . count($responses) . " responses\n";
});Fiberler Kodun Senkron Görünmesini Sağlar
Geri çağrı zincirlerini yönetmek zorlaşır. ReactPHP, PHP 8.1 fiberlerini kullanan react/async ile bütünleşir; böylece bir vaadi await() edebilir ve doğrusal kod yazabilirsiniz. coroutine()/async() sarmalayıcısı işlevinizi bir fiberin içinde çalıştırır.
<?php
use function React\Async\async;
use function React\Async\await;
use React\Http\Browser;
$main = async(function () {
$browser = new Browser();
$a = await($browser->get('https://httpbin.org/uuid'));
$b = await($browser->get('https://httpbin.org/uuid'));
echo (string) $a->getBody();
echo (string) $b->getBody();
});
$main();Engellemeyen TCP Sunucusu
ReactPHP sunucular için öne çıkar. Bir SocketServer bağlantıları kabul eder ve olaylar oluşturur; her bağlantı kendisi de engellemeyen bir akıştır. Tek bir süreç binlerce eşzamanlı istemciyi yönetir.
<?php
use React\Socket\SocketServer;
use React\Socket\ConnectionInterface;
$socket = new SocketServer('127.0.0.1:8080');
$socket->on('connection', function (ConnectionInterface $conn) {
$conn->write("Welcome\n");
$conn->on('data', function ($data) use ($conn) {
$conn->write('echo: ' . $data); // streamed back, non-blocking
});
});
echo "listening on 127.0.0.1:8080\n";Birkaç Satırda HTTP Sunucusu
react/http sunucusu, bir Response (veya bunun vaadini) döndüren bir geri çağrıyla istekleri işler. Kalıcı bir süreç olduğu için bağımlılıkları bir kez başlatırsınız; ancak istekler arasındaki bellek yönetimi de size aittir.
<?php
use React\Http\HttpServer;
use React\Http\Message\Response;
use Psr\Http\Message\ServerRequestInterface;
use React\Socket\SocketServer;
$http = new HttpServer(function (ServerRequestInterface $request) {
return Response::json(['path' => $request->getUri()->getPath()]);
});
$http->listen(new SocketServer('0.0.0.0:8000'));
echo "http://0.0.0.0:8000\n";Arabelleğe Almadan Akış
ReactPHP akışları geri basınç uygular: okunabilir bir akışı yazılabilir bir akışa pipe() edebilirsiniz ve çalışma zamanı hızı otomatik olarak sınırlar. Bu sayede dosyaları RAM'e yüklemek yerine sabit ve küçük bir bellek ayak iziyle gigabaytlarca veriyi taşıyabilirsiniz.
<?php
use React\Stream\ReadableResourceStream;
use React\Stream\WritableResourceStream;
$source = new ReadableResourceStream(fopen('big.log', 'r'));
$dest = new WritableResourceStream(fopen('php://stdout', 'w'));
$source->pipe($dest); // back-pressure aware, never buffers whole fileEn Büyük Hata: Döngüyü Engellemek
Bir işleyicinin içinde engelleyici bir işlev çağırdığınız anda her şey bozulur — sleep(), engelleyici PDO, bir URL üzerinde curl_exec, file_get_contents. Bunlar tek iş parçacığını dondurur ve tüm bağlantıları durdurur. ReactPHP karşılıklarını kullanın: gecikmeler için Loop::addTimer, sorgular için clue/reactphp-* veya asenkron veritabanı sürücüleri, HTTP için Browser.
<?php
use React\EventLoop\Loop;
use function React\Async\await;
use React\Promise\Deferred;
// BAD: sleep(2); // freezes the entire loop
// GOOD: async delay that yields control
function delay(float $s): \React\Promise\PromiseInterface {
$d = new Deferred();
Loop::addTimer($s, fn() => $d->resolve(null));
return $d->promise();
}
// await(delay(2.0)); // inside a fiber/coroutineEşzamanlılığı Sınırlama
Sınırsız iş dağıtımı, dosya tanımlayıcılarını tüketebilir veya alt sistemdeki bir arayüzü aşırı yükleyebilir. ReactPHP'nin clue/mq-react kuyruğu, eşzamanlılık sınırıyla çalışır; aynı anda N vaadi işlerken geri kalanları bekletir. Bu, dışarıya gönderdiğiniz kendi yükünüze geri basınç uygular.
<?php
use Clue\React\Mq\Queue;
use React\Http\Browser;
$browser = new Browser();
// At most 10 in-flight requests across 1000 URLs
$q = new Queue(10, null, fn($url) => $browser->get($url));
$promises = array_map(fn($u) => $q($u), $thousandUrls ?? []);
\React\Promise\all($promises)->then(function ($responses) {
echo 'completed ' . count($responses) . " with cap of 10\n";
});Hızlı Kontrol
Eşzamanlılığa zarar vermeden bir ReactPHP işleyicisi içinde 2 saniye nasıl bekleyebilirsiniz?
Özet
ReactPHP, standart PHP'ye engellemesiz G/Ç olanağı getirir:
- Tek bir olay döngüsü (
Loopcephesi) zamanlayıcıları, yuvaları ve akışları yönetir; uzantı gerekmez. - İşlemler vaatler döndürür;
all()istekleri paralel çalıştırır vereact/asyncile lifler, senkron görünümlü kod içinawait()kullanmanıza olanak tanır. - İşlem başına binlerce bağlantıyı yönetebilen kalıcı TCP/HTTP sunucuları ve geri basınçlı akışlar oluşturun.
- Döngüyü asla engellemeyin;
sleepve engelleyici G/Ç işlemlerini React zamanlayıcıları ve asenkron sürücülerle değiştirin.
Yapay zeka eğitmeniyle PHP öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 49
- Dersler
- 195
Sıkça Sorulan Sorular
“ReactPHP ile Olay Döngüleri” dersi ücretsiz mi?
Evet — “ReactPHP ile Olay Döngüleri” 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.
“ReactPHP ile Olay Döngüleri” dersinde ne öğreneceğim?
ReactPHP olay döngüsüyle engellemesiz G/Ç çalıştı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 3. dersidir.
“ReactPHP ile Olay Döngüleri” 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