Tworzenie wydajnych aplikacji PHP z Swoole w ServBay
ServBay to lokalne środowisko deweloperskie zaprojektowane specjalnie dla programistów, z gotowo preinstalowanymi wieloma wersjami języków, baz danych i narzędzi. Dzięki temu upraszcza lokalny proces tworzenia aplikacji. W tym artykule przedstawiamy, jak wykorzystać rozszerzenie Swoole w środowisku ServBay, aby zwiększyć możliwości aplikacji PHP i stworzyć wydajne usługi sieciowe.
Co to jest Swoole?
Swoole to silnik komunikacji sieciowej dla PHP, zaprojektowany w oparciu o korutyny (współprogramy), wyróżniający się równoległością oraz wysoką wydajnością. Jest napisany całkowicie w języku C i udostępnia PHP natywne mechanizmy do asynchronicznej, równoległej i współprogramowej komunikacji sieciowej. Dzięki Swoole programiści PHP mogą odejść od tradycyjnego modelu serwera WWW (np. Apache/Nginx + PHP-FPM), aby sprawniej obsługiwać zadania związane z dużą liczbą jednoczesnych połączeń. Umożliwia to tworzenie serwerów działających w pamięci, obsługę zadań asynchronicznych czy wdrażanie usług komunikacji w czasie rzeczywistym (np. WebSocket).
Kluczowe cechy Swoole:
- Wysoka wydajność: Implementacja na poziomie języka C, obsługa asynchronicznego I/O, wieloprocesowość i wielowątkowość.
- Korutyny: Lekki mechanizm współprogramów pozwalający na asynchroniczne działanie przy zachowaniu prostego, synchronicznego kodu.
- Wsparcie wielu protokołów: Natywna obsługa TCP, UDP, HTTP, WebSocket i innych.
- Łatwość użycia: Prosty, przyjazny programistom PHP interfejs API.
- Praca na stałe w pamięci: Aplikacje mogą działać jako procesy rezydujące, eliminując konieczność wielokrotnej inicjalizacji przy każdym żądaniu.
Dzięki Swoole PHP staje się nie tylko językiem do tworzenia stron WWW, lecz także uniwersalnym rozwiązaniem dla wysokowydajnych aplikacji sieciowych.
Jak włączyć Swoole w ServBay
ServBay jest zaprojektowany tak, aby zarządzanie rozszerzeniami PHP było maksymalnie proste. Swoole, kluczowe narzędzie nowoczesnego, wydajnego programowania w PHP, jest już preinstalowane w ServBay. Aktywujesz je w kilku prostych krokach.
Wymagania:
- Zainstalowany i uruchomiony ServBay.
- Przynajmniej jedna wersja PHP zainstalowana w ServBay.
Kroki aktywacji:
- Otwórz interfejs aplikacji ServBay.
- Przejdź do sekcji „Pakiety (Packages)” lub zarządzania wersjami PHP. (Uwaga: nazwa sekcji może się różnić w zależności od wersji ServBay – szukaj jej na stronie głównej lub w ustawieniach.)
- Wybierz wersję PHP, dla której chcesz użyć Swoole.
- Znajdź opcję rozszerzenia Swoole i aktywuj ją. W ServBay lista rozszerzeń zwykle jest dostępna pod postacią listy wyboru lub przełącznika.
- Zapisz zmiany i zrestartuj ServBay lub odpowiednią usługę PHP zgodnie z instrukcjami. ServBay automatycznie skonfiguruje środowisko PHP, aby ładowało rozszerzenie Swoole.
Po wykonaniu tych kroków możesz korzystać z Swoole w wybranej wersji PHP. Uruchom w terminalu polecenie php -m
, by upewnić się, że swoole
jest widoczne na liście załadowanych rozszerzeń.
TIP
Domyślnie ServBay zaleca przechowywać pliki stron i projektów w katalogu /Applications/ServBay/www
; to ułatwia zarządzanie witrynami i konfigurację. W przykładach w tym artykule zastosujemy właśnie tę ścieżkę.
Prosty serwer HTTP z Swoole
Stworzymy teraz prosty serwer HTTP na Swoole, który obsługuje żądania WWW.
Krok 1: Utwórz katalog projektu
Otwórz terminal i utwórz nowy katalog projektu w zalecanej lokalizacji /Applications/ServBay/www
:
bash
cd /Applications/ServBay/www
mkdir servbay-swoole-http
cd servbay-swoole-http
1
2
3
2
3
Krok 2: Utwórz skrypt serwera
W katalogu servbay-swoole-http
utwórz plik server.php
z następującą zawartością:
php
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
// Tworzenie instancji serwera HTTP Swoole
// Nasłuchiwanie na wszystkich interfejsach sieciowych (0.0.0.0), port 9501
$server = new Server("0.0.0.0", 9501);
// Rejestracja funkcji obsługującej zdarzenie 'start'
// Wywoływana, gdy serwer pomyślnie się uruchomi
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
// Tutaj można zapisać PID głównego procesu lub inne informacje
});
// Rejestracja obsługi zdarzenia 'request'
// Wywoływana przy każdym nowym żądaniu HTTP
$server->on("request", function (Request $request, Response $response) {
// Ustawianie nagłówka odpowiedzi
$response->header("Content-Type", "text/plain");
// Obsługa logiki w zależności od ścieżki lub parametrów żądania
$path = $request->server['request_uri'] ?? '/';
$content = "Hello ServBay!";
if ($path === '/info') {
$content = "Ścieżka żądania: " . $path . "\n";
$content .= "Metoda: " . $request->server['request_method'] . "\n";
$content .= "IP klienta: " . $request->server['remote_addr'] . "\n";
// Dodatkowe informacje można uzyskać przez obiekt $request
}
// Wysyłanie odpowiedzi i kończenie żądania
$response->end($content);
});
// Uruchomienie serwera
$server->start();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Ten skrypt uruchamia serwer HTTP Swoole na porcie 9501. Po odebraniu żądania wysyła prostą odpowiedź tekstową „Hello ServBay!”. Jeśli odwiedzisz ścieżkę /info
, serwer zwróci dodatkowe informacje o żądaniu.
Krok 3: Uruchom serwer Swoole
Upewnij się, że jesteś w katalogu servbay-swoole-http
. Użyj PHP z aktywnym Swoole w ServBay, aby uruchomić skrypt:
bash
php server.php
1
Prawidłowy start zobaczysz po następującym komunikacie:
bash
Swoole HTTP server is started at http://0.0.0.0:9501
1
To oznacza, że serwer HTTP Swoole nasłuchuje na porcie 9501.
Krok 4: Przetestuj serwer Swoole
Otwórz przeglądarkę i odwiedź:
http://localhost:9501
http://localhost:9501/info
Zobaczysz na stronie kolejno „Hello ServBay!” oraz tekst z informacjami o żądaniu.
Aby zatrzymać serwer, wróć do terminala i naciśnij Ctrl + C
.
Obsługa połączeń WebSocket w Swoole
Swoole natywnie obsługuje protokół WebSocket, co pozwala łatwo budować aplikacje czasu rzeczywistego, takie jak czaty, gry czy systemy push.
Krok 1: Utwórz skrypt serwera WebSocket
W katalogu /Applications/ServBay/www/servbay-swoole-http
(lub w nowym katalogu, np. servbay-swoole-websocket
) utwórz plik websocket_server.php
z następującą treścią:
php
<?php
use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
// Tworzenie instancji serwera WebSocket Swoole
// Serwer WebSocket dziedziczy po HTTP – obsługuje też żądania HTTP
$server = new Server("0.0.0.0", 9502); // Nasłuchiwanie portu 9502
// Rejestracja zdarzenia 'start', wywoływana po starcie serwera
$server->on("start", function (Server $server) {
echo "Swoole WebSocket server is started at ws://0.0.0.0:9502\n";
});
// Rejestracja zdarzenia 'open'
// Wywoływana, gdy następuje nowe połączenie WebSocket
// Obiekt $request zawiera dane o kliencie, np. $request->fd – deskryptor klienta
$server->on("open", function (Server $server, Request $request) {
echo "Połączono: {$request->fd}\n";
// Możesz wysłać klientowi wiadomość powitalną
$server->push($request->fd, "Welcome to ServBay WebSocket Demo!");
});
// Rejestracja zdarzenia 'message'
// Wywoływana po odebraniu wiadomości WebSocket od klienta
// Obiekt $frame zawiera treść wiadomości ($frame->data) i deskryptor klienta ($frame->fd)
$server->on("message", function (Server $server, Frame $frame) {
echo "Odebrano wiadomość od {$frame->fd}: {$frame->data}\n";
// Odpowiedz nadawcy lub nadaj wiadomość wszystkim klientom (broadcast)
// Przykład: odpowiedz nadawcy
$server->push($frame->fd, "Hello, you sent: {$frame->data}");
// Przykład broadcastu (wymaga listy połączeń lub iteracji)
// foreach ($server->connections as $fd) {
// if ($fd != $frame->fd) { // Nie wysyłaj do nadawcy
// $server->push($fd, "User {$frame->fd} says: {$frame->data}");
// }
// }
});
// Rejestracja zdarzenia 'close'
// Wywoływana po zamknięciu połączenia przez klienta
$server->on("close", function ($ser, $fd) {
echo "Rozłączono: {$fd}\n";
});
// Uruchomienie serwera
$server->start();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Ten skrypt uruchamia serwer WebSocket na porcie 9502, obsługując typowe zdarzenia: start
(uruchomienie), open
(nowe połączenie), message
(otrzymanie wiadomości), close
(zakończenie połączenia). W przypadku zdarzenia message
serwer odsyła otrzymaną wiadomość ze specjalnym prefiksem.
Krok 2: Uruchom serwer WebSocket
Upewnij się, że jesteś w katalogu z plikiem websocket_server.php
. Uruchom go, korzystając z PHP z aktywnym Swoole w ServBay:
bash
php websocket_server.php
1
Przy poprawnym uruchomieniu zobaczysz:
bash
Swoole WebSocket server is started at ws://0.0.0.0:9502
1
To oznacza, że serwer WebSocket działa i nasłuchuje na porcie 9502.
Krok 3: Połącz się z serwerem WebSocket
Masz kilka sposobów na przetestowanie połączenia z tym serwerem.
Metoda A: Narzędzia deweloperskie przeglądarki
Nowoczesne przeglądarki mają narzędzia (zwykle F12), w których w panelu „Sieć (Network)” lub „Konsola (Console)” możesz testować WebSocket.
Otwórz dowolną stronę (np.
about:blank
).Włącz narzędzia deweloperskie i przejdź do „Konsoli (Console)”.
Wklej poniższy kod JavaScript, aby nawiązać połączenie:
javascriptvar ws = new WebSocket("ws://localhost:9502"); ws.onopen = function(event) { console.log("WebSocket connection opened:", event); ws.send("Hello from Browser!"); // Wysyłka przykładowej wiadomości po połączeniu }; ws.onmessage = function(event) { console.log("Message from server:", event.data); // Odbiór wiadomości od serwera }; ws.onerror = function(event) { console.error("WebSocket error:", event); // Obsługa błędów }; ws.onclose = function(event) { console.log("WebSocket connection closed:", event); // Informacja o zamknięciu połączenia }; // Możesz w każdej chwili ws.send("Twoja wiadomość") // Zakończ przez ws.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21Sprawdź efekty i logi w konsoli oraz terminalu z uruchomionym serwerem.
Metoda B: Klient wscat
w terminalu
wscat
to narzędzie klienckie WebSocket oparte na Node.js, wygodne do testów.
Zainstaluj
wscat
: Jeśli nie masz Node.js i npm, najpierw je zainstaluj. Potem wykonaj polecenie:bashnpm install -g wscat
1Połącz się z serwerem: W terminalu wpisz:
bashwscat -c ws://localhost:9502
1Przy poprawnym połączeniu zobaczysz prompt
>
.Wyślij wiadomość: Wpisz dowolną wiadomość, np.:
bash> Hello ServBay via wscat
1Otrzymasz odpowiedź od serwera, oznaczoną znakiem
<
:bash< Hello, you sent: Hello ServBay via wscat
1W oknie serwera zobaczysz log zdarzeń.
Aby zakończyć połączenie w wscat
, wciśnij Ctrl + C
.
Wskazówki i uwagi
- Konflikty portów: Upewnij się, że porty serwerów Swoole (np. 9501, 9502) nie są zajęte przez inne procesy. W przeciwnym wypadku serwer nie uruchomi się.
- Wersja PHP: Przy uruchamianiu skryptów w terminalu korzystaj z tej wersji PHP, w której aktywowałeś Swoole w ServBay. Możesz sprawdzić wersję przez
php -v
. ServBay pozwala łatwo przełączać wersje PHP. - Status rozszerzenia: W razie problemów ze startem, sprawdź jeszcze raz, czy Swoole jest aktywowane w Adekwatnej wersji PHP i czy po zmianach zrestartowano ServBay lub usługę PHP.
- Zarządzanie procesami rezydującymi: Swoole działa jako proces rezydujący w pamięci. W środowisku produkcyjnym powinieneś zadbać o zarządzanie procesami (np. Supervisor, Systemd, pm2), by serwer restartował się automatycznie w razie awarii. Na potrzeby lokalnego testowania w ServBay wystarczy uruchomienie w terminalu.
Podsumowanie
Dzięki ServBay możesz łatwo aktywować i używać rozszerzenia Swoole, budować oraz testować lokalnie wydajne aplikacje PHP – zarówno tradycyjne usługi HTTP, jak i nowoczesne aplikacje w czasie rzeczywistym oparte na WebSocket. Połączenie mocy Swoole i wygody ServBay otwiera nowe możliwości dla programistów PHP, pozwalając im tworzyć jeszcze wydajniejsze i bardziej rozbudowane aplikacje. Wypróbuj Swoole w ServBay już teraz!