Kas ta Swoole ir kodėl apie ją visi kalba
PHP programuotojai jau seniai girdėjo kalbas, kad jų mylima kalba yra lėta, neefektyvi ir netinkama rimtoms aplikacijoms. Tačiau atsirado įrankis, kuris šias kalbas užčiaupė – Swoole. Tai C kalboje parašytas PHP plėtinys, kuris PHP paverčia tikru asinchroniniu žvėriu, galinčiu konkuruoti su Node.js ar Go.
Swoole iš esmės leidžia PHP veikti nuolat veikiančio serverio režimu, o ne tradiciniame „request-response” cikle, kurį visi įpratę matyti su Apache ar Nginx + PHP-FPM. Tai reiškia, kad jūsų aplikacija užsikrauna vieną kartą ir lieka atmintyje, apdorodama tūkstančius užklausų per sekundę be nuolatinio perkrovimo.
Pirmą kartą susidūrus su Swoole, daugelis programuotojų patiria tikrą „mind-blow” momentą. Staiga PHP gali daryti dalykus, kurie anksčiau atrodė neįmanomi – WebSocket serveriai, asinchroninės duomenų bazių užklausos, korutinos, daugiaprocesinis apdorojimas. Visa tai be jokių papildomų įrankių ar sudėtingų konfigūracijų.
Kaip Swoole keičia PHP žaidimo taisykles
Tradicinis PHP veikia labai paprastai: gaunama užklausa, paleidžiamas PHP skriptas, jis atlieka savo darbą ir baigia veikti. Kiekviena nauja užklausa – naujas procesas. Tai reiškia, kad kiekvieną kartą reikia inicializuoti visą aplinką, prisijungti prie duomenų bazės, užkrauti konfigūracijas. Tai užima laiką ir resursus.
Swoole veikia visiškai kitaip. Jūs paleidžiate serverį vieną kartą, ir jis lieka veikti. Visos inicializacijos vyksta tik kartą. Duomenų bazės jungtys išlieka aktyvios ir gali būti pakartotinai naudojamos. Tai ne tik greičiau – tai kardinaliai greičiau. Kalbama apie 10-100 kartų spartesnį veikimą, priklausomai nuo aplikacijos tipo.
Bet svarbiausia – asinchroniškumas. Įsivaizduokite, kad jūsų aplikacija turi padaryti 5 skirtingas duomenų bazės užklausas. Tradiciniame PHP jos vykdomos nuosekliai: pirmoji, tada antroji, trečioji ir t.t. Su Swoole galite jas paleisti visas vienu metu ir laukti, kol visos baigs darbą. Jei kiekviena užklausa trunka 100ms, tradicinis būdas užtruks 500ms, o asinchroninis – tik 100ms.
Korutinos – mažos stebukldarės
Swoole korutinos yra viena iš galingiausių funkcijų. Tai ne threadai, ne procesai – tai lengvos vykdymo vienetai, kurie gali būti sustabdyti ir atnaujinti be jokių blokuojančių operacijų. Skamba sudėtingai? Praktikoje tai paprasta.
Tarkime, turite kodą, kuris siunčia HTTP užklausą į išorinį API:
„`php
$client = new Swoole\Coroutine\Http\Client(‘api.example.com’, 443, true);
$client->get(‘/users’);
$response = $client->body;
„`
Kai vykdoma `get()` operacija, korutina automatiškai „sustoja” ir leidžia kitoms korutinoms dirbti. Kai atsakymas gaunamas, korutina tęsia darbą. Jūsų kodas atrodo sinchroninis ir paprastas, bet veikia asinchroniškai ir efektyviai.
Viename procese galite turėti tūkstančius korutinų, ir jos visos veiks sklandžiai. Tai leidžia apdoroti milžinišką kiekį vienu metu vykstančių operacijų naudojant minimalius resursus. Pavyzdžiui, WebSocket serveris gali aptarnauti 100,000+ vienu metu prijungtų klientų vienoje mašinoje.
Praktinis Swoole HTTP serverio pavyzdys
Sukurti paprastą HTTP serverį su Swoole yra juokingai paprasta. Štai minimalus pavyzdys:
„`php
$server = new Swoole\Http\Server(„0.0.0.0”, 9501);
$server->on(„start”, function ($server) {
echo „Swoole serveris paleistas ties http://127.0.0.1:9501\n”;
});
$server->on(„request”, function ($request, $response) {
$response->header(„Content-Type”, „application/json”);
$response->end(json_encode([
‘message’ => ‘Labas iš Swoole!’,
‘time’ => date(‘Y-m-d H:i:s’)
]));
});
$server->start();
„`
Paleiskite šį skriptą (`php server.php`), ir turite veikiantį HTTP serverį. Jokio Apache, jokio Nginx, jokio PHP-FPM. Tiesiog PHP ir Swoole. Serveris gali apdoroti tūkstančius užklausų per sekundę ir niekada nesustoja.
Kas dar geriau – galite pridėti connection pooling duomenų bazėms, cache mechanizmus, WebSocket palaikymą. Viskas vienoje vietoje, viskas PHP kalba, viskas greitai.
Duomenų bazių darbas asinchroniškai
Vienas didžiausių bottleneck’ų bet kurioje aplikacijoje yra duomenų bazės užklausos. Su Swoole galite jas vykdyti asinchroniškai, naudojant korutinas. Štai kaip tai atrodo su MySQL:
„`php
go(function () {
$db = new Swoole\Coroutine\MySQL();
$db->connect([
‘host’ => ‘127.0.0.1’,
‘user’ => ‘root’,
‘password’ => ‘password’,
‘database’ => ‘test’,
]);
$result = $db->query(‘SELECT * FROM users WHERE active = 1’);
var_dump($result);
});
„`
Funkcija `go()` sukuria naują korutiną. Kai vykdoma `query()`, korutina automatiškai „užmiega” ir leidžia kitoms korutinoms dirbti. Kai rezultatas gaunamas, korutina pabunda ir tęsia darbą.
Dar įspūdingiau – galite vykdyti kelias užklausas vienu metu:
„`php
go(function () {
$results = [];
// Paleisti 3 užklausas vienu metu
go(function () use (&$results) {
$db = getDbConnection();
$results[‘users’] = $db->query(‘SELECT * FROM users’);
});
go(function () use (&$results) {
$db = getDbConnection();
$results[‘posts’] = $db->query(‘SELECT * FROM posts’);
});
go(function () use (&$results) {
$db = getDbConnection();
$results[‘comments’] = $db->query(‘SELECT * FROM comments’);
});
// Palaukti, kol visos baigs
Swoole\Coroutine::sleep(0.1);
// Dabar turime visus rezultatus
processResults($results);
});
„`
WebSocket serveris per 5 minutes
Norite realaus laiko funkcionalumo savo aplikacijoje? Su Swoole WebSocket serverį sukursite greičiau nei spėsite pasakyti „Socket.IO”. Štai pilnai veikiantis pavyzdys:
„`php
$server = new Swoole\WebSocket\Server(„0.0.0.0”, 9502);
$server->on(‘open’, function ($server, $request) {
echo „Naujas prisijungimas: {$request->fd}\n”;
});
$server->on(‘message’, function ($server, $frame) {
echo „Gauta žinutė: {$frame->data}\n”;
// Išsiųsti visiems prijungusiems klientams
foreach ($server->connections as $fd) {
$server->push($fd, „Serveris sako: {$frame->data}”);
}
});
$server->on(‘close’, function ($server, $fd) {
echo „Atsijungė: {$fd}\n”;
});
$server->start();
„`
Tai viskas. Turite veikiantį WebSocket serverį, kuris gali aptarnauti tūkstančius vienu metu prijungtų klientų. Galite kurti chat’us, realaus laiko dashboardus, multiplayer žaidimus – viską, kas reikalauja greito dvipusio komunikavimo.
Integravimas su egzistuojančiais projektais
Gera žinia – nereikia perrašyti visos aplikacijos, kad pradėtumėte naudoti Swoole. Daugelis populiarių framework’ų jau turi Swoole palaikymą ar adapterius. Laravel turi Laravel Octane, Symfony turi savo sprendimus, o Hyperf yra framework’as, specialiai sukurtas Swoole.
Su Laravel Octane pradėti yra itin paprasta:
„`bash
composer require laravel/octane
php artisan octane:install –server=swoole
php artisan octane:start
„`
Ir viskas – jūsų Laravel aplikacija dabar veikia ant Swoole. Jokių kodo pakeitimų, jokių sudėtingų konfigūracijų. Tiesiog instaliuojate ir paleidžiate. Performance’o skirtumas bus akivaizdus iš karto.
Jei naudojate custom sprendimą, galite integruoti Swoole palaipsniui. Pavyzdžiui, pradėti nuo API endpointų, kurie reikalauja didelio našumo, o likusią aplikaciją palikti tradicinėje aplinkoje. Arba naudoti Swoole tik specifinėms užduotims – WebSocket serveriui, background job’ams, cache serveriui.
Ką reikia žinoti prieš šokant į vandenį
Swoole nėra sidabrinė kulka, ir yra keletas dalykų, kuriuos būtina suprasti prieš pradedant. Pirma, jūsų kodas dabar veikia ilgalaikėje aplinkoje. Tai reiškia, kad memory leak’ai, kurie tradiciniame PHP būtų nepastebimai (nes procesas baigiasi po kiekvienos užklausos), dabar gali tapti rimta problema.
Globalios kintamųjų būsenos taip pat gali sukelti problemų. Jei kažką išsaugote globaliame kintamajame, jis išliks tarp užklausų. Tai gali būti ir gerai (cache’inimui), ir blogai (jei netyčia „nutekina” duomenis tarp skirtingų vartotojų užklausų).
Debugging’as taip pat šiek tiek kitoks. Negalite tiesiog `var_dump()` ir tikėtis pamatyti rezultatą naršyklėje – serveris veikia CLI režimu. Reikia naudoti logging’ą arba specialius debug įrankius.
Dar vienas dalykas – ne visos PHP bibliotekos yra suderinamos su Swoole. Ypač tos, kurios naudoja blokuojančias operacijas ar nesuderinamas su korutinomis funkcijas. Dauguma populiarių bibliotekų veikia puikiai, bet prieš pradedant projektą verta patikrinti.
Taip pat reikia prisiminti, kad Swoole reikalauja PHP plėtinio instaliavimo. Tai ne Composer paketas – tai C plėtinys, kurį reikia kompiliuoti ir įjungti. Shared hosting’uose tai greičiausiai neveiks, reikės VPS ar dedikuoto serverio su root prieiga.
Kai greitis tampa realybe, o ne svajonė
Swoole pakeitė tai, kaip galvojame apie PHP. Tai nebėra tik „web scripting” kalba, tinkama tik paprastoms svetainėms. Su Swoole PHP gali būti naudojamas high-performance aplikacijoms, mikroservisams, realaus laiko sistemoms – visam tam, kam anksčiau rinkotumėtės Node.js, Go ar Java.
Ar verta išbandyti? Jei kuriate naują projektą, kuris reikalauja didelio našumo, arba jei esama aplikacija kenčia nuo performance problemų – definityviai taip. Net jei tiesiog norite išmokti kažko naujo ir pamatyti, ką PHP iš tikrųjų gali, Swoole yra puiki vieta pradėti.
Bendruomenė auga, dokumentacija gerėja, framework’ai prideda palaikymą. Tai nebėra eksperimentinis projektas – tai brandus, production-ready sprendimas, kurį naudoja didžiulės kompanijos Kinijoje ir vis labiau populiarėjantis Vakaruose. Galbūt laikas ir jums prisijungti prie šios revoliucijos?
