Swoole ile Yüksek Performanslı Sunucular
Kuyruk düzeneklerine dayalı Swoole ile binlerce bağlantıya hizmet verin.
Swoole ile Yüksek Performanslı Sunucular, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 4. 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.
Swoole Nedir
Swoole (ve çatallaması olan OpenSwoole), PHP'yi yüksek performanslı, eş yordam tabanlı ve olay güdümlü bir çalışma zamanına dönüştüren bir C uzantısıdır. PHP-FPM'nin istek başına bir süreç başlatması yerine Swoole sunucusu uygulamanızı bir kez başlatır ve bellekte tutar; istekleri, yerleşik eş yordamları olan uzun ömürlü çalışan havuzundan sunar. Sonuç olarak verimlilik kat kat artar ve tek bir istek içinde yerel eşzamanlılık elde edilir.
Kalıcı HTTP Sunucusu
Klasik örnek: bir betik içinde eksiksiz bir HTTP sunucusu. Sunucu dinler, her isteği bir çalışan sürece dağıtır ve çatıyı yeniden başlatmaz. Bunun ext-swoole gerektirdiğine dikkat edin; standart PHP CLI üzerinde çalışmaz.
<?php
$server = new Swoole\Http\Server('0.0.0.0', 9501);
$server->set(['worker_num' => 4]);
$server->on('request', function ($request, $response) {
$response->header('Content-Type', 'application/json');
$response->end(json_encode(['hello' => $request->server['request_uri']]));
});
echo "listening on :9501\n";
$server->start();Geri Çağrılar Yerine Eş Yordamlar
Swoole'un en güçlü özelliği eş yordamlardır: çalışma zamanının işbirliğine dayalı olarak planladığı, engelleyici tarzda sıralı kod yazarsınız. Coroutine\run() bir eş yordam bağlamı açar; go() yeni bir eş yordam başlatır. Her eş yordamın bir lif gibi kendi yığını vardır, ancak Swoole bunları G/Ç noktalarında otomatik olarak planlar.
<?php
use Swoole\Coroutine as Co;
Co\run(function () {
go(function () { Co::sleep(1); echo "A done\n"; });
go(function () { Co::sleep(1); echo "B done\n"; });
// Both sleep concurrently -> total ~1s, not 2s
});Kancalanmış Engelleyici İşlevler
Eş yordamları kullanışlı kılan sihir şudur: çalışma zamanı kancaları. Swoole, engelleyici çağrıları — PDO, Redis, curl, sleep, file_get_contents — şeffaf biçimde engellemesiz ve eş yordam uyumlu sürümlerle değiştirir. Olağan $pdo->query() çağrınız çalışanı dondurmak yerine eş yordamı askıya alır.
<?php
use Swoole\Runtime;
use Swoole\Coroutine as Co;
Runtime::enableCoroutine(SWOOLE_HOOK_ALL); // hook PDO, curl, sleep, etc.
Co\run(function () {
go(function () { sleep(1); echo "task 1\n"; }); // sleep() is now async!
go(function () { sleep(1); echo "task 2\n"; });
}); // finishes in ~1s because sleep was hookedWaitGroup ile Eşzamanlı G/Ç
İşleri dağıtıp sonuçlarını birleştirmek için Swoole, Go dilindeki sync.WaitGroup benzeri bir WaitGroup sunar. Eş yordamları başlatın, her görev için add() çağırın, tamamlandığında done() çağırın ve tüm görevlerin eşzamanlı olarak bitmesini beklemek için wait() kullanın.
<?php
use Swoole\Coroutine as Co;
use Swoole\Coroutine\WaitGroup;
Co\run(function () {
$wg = new WaitGroup();
$results = [];
foreach (['eu', 'us', 'asia'] as $region) {
$wg->add();
go(function () use ($wg, $region, &$results) {
Co::sleep(0.5); // simulated API call
$results[$region] = "ok-$region";
$wg->done();
});
}
$wg->wait(); // all three ran in parallel (~0.5s)
var_dump($results);
});İletişim İçin Kanallar
Eş yordamlar, Kanallar aracılığıyla koordinasyon sağlar; bunlar, üretici doluyken üreticiyi, tüketici boşken tüketiciyi askıya alan, türü belirli ve sınırlı kuyruklardır. Bu, paylaşılan durum kilitlerini tamamen ortadan kaldıran CSP tarzı mesajlaşmadır.
<?php
use Swoole\Coroutine as Co;
use Swoole\Coroutine\Channel;
Co\run(function () {
$chan = new Channel(2);
go(function () use ($chan) {
foreach (range(1, 3) as $n) $chan->push($n);
$chan->push(null); // sentinel
});
go(function () use ($chan) {
while (($v = $chan->pop()) !== null) echo "got $v\n";
});
});Bağlantı Havuzları
Kalıcı bir sunucu her istek için yeni bir veritabanı bağlantısı açmamalıdır. Swoole, çalışanların binlerce eşzamanlı eş yordam arasında sabit bir bağlantı kümesini yeniden kullanmasını sağlayan, eş yordam güvenli bağlantı havuzları sunar; böylece bağlantı açıp kapatma yükü ortadan kalkar.
<?php
use Swoole\Database\PDOConfig;
use Swoole\Database\PDOPool;
use Swoole\Coroutine as Co;
Co\run(function () {
$pool = new PDOPool((new PDOConfig())
->withHost('127.0.0.1')->withDbname('app')
->withUsername('u')->withPassword('p'), 8);
go(function () use ($pool) {
$pdo = $pool->get(); // borrow
$row = $pdo->query('SELECT NOW()')->fetch();
$pool->put($pdo); // return to pool
var_dump($row);
});
});Durum Sızıntıları: Kalıcı Bellek Tuzağı
Süreç istekler arasında yaşamaya devam ettiği için genel ve statik durum kalıcı olur. Sınırsız büyüyen bir statik önbellek, istekle ilgili verileri tutan bir tekil nesne veya sızmış bir veritabanı işlemi sonraki istekleri bozabilir ve belleği tüketebilir. Kurallar: statiklerde ve tekil nesnelerde istek kapsamlı veri tutmayın, istek başına bağlamı sıfırlayın ve çalışanların düzenli aralıklarla yeniden oluşturulması için max_request ayarlayın.
<?php
$server = new Swoole\Http\Server('0.0.0.0', 9501);
$server->set([
'worker_num' => 8,
'max_request' => 10000, // recycle a worker after N requests to bound leaks
]);
// Never store $request data in a static property between requests!Eş Yordam Yerel Bağlamı
Tek bir çalışan birçok eş yordamı iç içe çalıştırdığı için istek başına verilerde sıradan statikleri kullanamazsınız. Swoole her eş yordam için bir bağlam (Coroutine::getContext()) sağlar. Bu nesnenin yaşam süresi eş yordam kadardır; dolayısıyla mevcut kullanıcı, istek kimliği veya işlem tutamacı için idealdir.
<?php
use Swoole\Coroutine as Co;
Co\run(function () {
go(function () {
$ctx = Co::getContext();
$ctx['request_id'] = 'req-123';
// ... deep call chain can read Co::getContext()['request_id']
echo Co::getContext()['request_id'], PHP_EOL;
});
});Süreç Modeli ve Görev Çalışanları
Swoole bir ana süreç (olay döngüsü iş parçacıklarını yönetir), bir yönetici (çalışanları başlatır ve izler), çalışan süreçleri (istek işleyicilerinizi ve eş yordamları çalıştırır) ve isteğe bağlı olarak $server->task() aracılığıyla aktarılan ağır, engelleyici veya CPU yoğun işler için görev çalışanları çalıştırır. Görüntü işleme veya uzun süren CPU işlerini görev çalışanlarına aktarın; böylece istek eş yordamlarını durdurmadan hem eşzamanlılık hem de paralellik elde edersiniz.
Erteleme ve Zamanlayıcılar
Swoole, mevcut eş yordam tamamlandıktan sonra çalışacak işleri Coroutine::defer() ile planlamanıza olanak tanır. Bu, bir istisna fırlatılsa bile havuzlanmış kaynakların güvenilir biçimde serbest bırakılması için idealdir. Sunucu genelindeki zamanlayıcılar (Timer::tick), harici bir zamanlayıcı olmadan çalışan içinde önbellek yenileme gibi yinelenen işleri yürütür.
<?php
use Swoole\Coroutine as Co;
Co\run(function () {
go(function () {
$conn = 'borrowed-connection';
Co::defer(function () use ($conn) {
echo "released $conn\n"; // runs when coroutine exits, even on error
});
echo "using $conn\n";
});
});Hızlı Kontrol
Swoole sunucusunda istek verilerini statik özelliklerde depolamaktan neden kaçınmalısınız?
Özet
Swoole, PHP'yi bellekte kalıcı ve eş yordamlarla yönlendirilen bir sunucuya dönüştürür:
- Uygulama bir kez başlatılır; bir çalışan havuzu, yerleşik eş yordamlarla (
Co\run/go()) istekleri sunar. - Çalışma zamanı kancaları, sıradan PDO/curl/sleep çağrılarını engellemesiz hâle getirir; WaitGroup ve Kanallar eşzamanlı işleri koordine eder.
- Bağlantı havuzları, veritabanı bağlantılarını eş yordamlar arasında yeniden kullanır.
- Kalıcı bellek, durum sızıntılarından kaçınmanızı gerektirir: istek başına veriler için
Coroutine::getContext()kullanın,max_requestayarlayın ve ağır işleri görev çalışanlarına aktarın.
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
“Swoole ile Yüksek Performanslı Sunucular” dersi ücretsiz mi?
Evet — “Swoole ile Yüksek Performanslı Sunucular” 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.
“Swoole ile Yüksek Performanslı Sunucular” dersinde ne öğreneceğim?
Kuyruk düzeneklerine dayalı Swoole ile binlerce bağlantıya hizmet verin. 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 4. dersidir.
“Swoole ile Yüksek Performanslı Sunucular” 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