Tworzenie wysokowydajnych aplikacji PHP z Swoole w ServBay
ServBay to lokalne środowisko programistyczne stworzone dla developerów, obejmujące wiele języków, baz danych i narzędzi, które upraszczają cały proces tworzenia stron WWW. W tym poradniku pokazujemy, jak korzystać z rozszerzenia Swoole w ServBay, by podnieść wydajność aplikacji PHP oraz budować nowoczesne usługi sieciowe.
Co to jest Swoole?
Swoole to silnik sieciowy dla PHP oparty na korutynach (Coroutine), oferujący równoległe, wysokowydajne komunikacje sieciowe. Napisany całkowicie w C, Swoole dostarcza PHP możliwości asynchronicznego, równoległego i korutynowego programowania sieciowego. Dzięki Swoole programiści PHP nie są już ograniczeni tradycyjnym modelem tzw. request-response serwerów (jak Apache/Nginx + PHP-FPM) i mogą z łatwością realizować zadania wymagające wysokiej wydajności, takie jak serwery utrzymywane w pamięci, przetwarzanie zadań asynchronicznych lub usługi komunikacji w czasie rzeczywistym (np. WebSocket).
Kluczowe cechy Swoole:
- Wysoka wydajność: Kod napisany w C, wsparcie dla asynchronicznego I/O, wiele procesów i wątków.
- Korutyny: Lekkie korutyny umożliwiające asynchroniczne wykonanie kodu napisanego synchronicznie, znaczne uproszczenie programowania.
- Bogate wsparcie protokołów: Wbudowana obsługa TCP/UDP/HTTP/WebSocket i innych protokołów.
- Łatwość użycia: Przejrzyste API zgodne z przyzwyczajeniami programistów PHP.
- Stałość w pamięci: Aplikacje mogą działać jako ciągłe procesy, bez niepotrzebnego restartowania środowiska przy każdym żądaniu, tak jak w tradycyjnych aplikacjach PHP.
Z Swoole PHP staje się nie tylko skryptowym językiem webowym, ale także solidnym narzędziem do tworzenia wydajnych aplikacji sieciowych.
Jak włączyć Swoole w ServBay
Jednym z założeń ServBay jest proste zarządzanie rozszerzeniami PHP. Swoole, jako kluczowe rozszerzenie dla współczesnego PHP, jest już wstępnie zainstalowane w ServBay. Włączenie go zajmuje tylko kilka chwil.
Wymagania:
- Zainstalowany i uruchomiony ServBay.
- Przynajmniej jedna wersja PHP zainstalowana w ServBay.
Jak włączyć Swoole:
- Otwórz interfejs aplikacji ServBay.
- Przejdź do zakładki „Pakiety (Packages)” lub panelu zarządzania wersjami PHP. (Uwaga: nazwa ścieżki może się nieco różnić zależnie od wersji ServBay, zwykle znajdziesz ją na stronie głównej lub w ustawieniach)
- Wybierz wersję PHP, w której chcesz włączyć Swoole.
- Znajdź opcję rozszerzenia Swoole i zaznacz ją, aby ją aktywować. ServBay prezentuje gotowe rozszerzenia jako listę lub przełączniki.
- Zapisz zmiany i zgodnie z instrukcją uruchom ponownie ServBay lub wybrany serwis PHP. ServBay automatycznie skonfiguruje środowisko i załaduje rozszerzenie Swoole.
Po tych czynnościach możesz korzystać z Swoole w wybranej wersji PHP. Zweryfikuj, czy swoole
pojawiło się na liście rozszerzeń, uruchamiając php -m
w terminalu.
TIP
Domyślnie ServBay zaleca przechowywanie stron i plików projektowych w poniższych lokalizacjach, co ułatwia zarządzanie i konfigurację:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
W poniższych przykładach również będziemy używać tych ścieżek.
Budowa prostego serwera HTTP z Swoole
Stwórzmy podstawowy serwer HTTP w oparciu o Swoole, który obsłuży żądania sieciowe.
Krok 1: Utworzenie katalogu projektu
Otwórz terminal, utwórz nowy katalog projektu i wejdź do niego, zgodnie z lokalizacją zalecaną przez ServBay:
macOS:
bash
cd /Applications/ServBay/www
mkdir servbay-swoole-http
cd servbay-swoole-http
1
2
3
2
3
Windows:
cmd
cd C:\ServBay\www
mkdir servbay-swoole-http
cd servbay-swoole-http
1
2
3
2
3
Krok 2: Stworzenie skryptu serwera
W katalogu servbay-swoole-http
utwórz plik server.php
z następującą treścią:
php
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
// Tworzenie instancji serwera Swoole HTTP
// Nasłuchiwanie na wszystkich interfejsach sieciowych (0.0.0.0) na porcie 9501
$server = new Server("0.0.0.0", 9501);
// Rejestracja callbacku dla zdarzenia "start"
// Wyzwalane po sukcesywnym uruchomieniu serwera
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
// Tutaj możesz zapisać ID procesu głównego, procesu zarządzającego etc.
});
// Rejestracja callbacku dla zdarzenia "request"
// Wyzwalane przy każdym nowym żądaniu HTTP
$server->on("request", function (Request $request, Response $response) {
// Ustawienie nagłówka odpowiedzi
$response->header("Content-Type", "text/plain");
// Logika obsługi na podstawie ścieżki żądania lub parametrów
$path = $request->server['request_uri'] ?? '/';
$content = "Hello ServBay!";
if ($path === '/info') {
$content = "Request path: " . $path . "\n";
$content .= "Method: " . $request->server['request_method'] . "\n";
$content .= "Client IP: " . $request->server['remote_addr'] . "\n";
// Więcej informacji o żądaniu można pobrać z obiektu $request
}
// Wysyłanie odpowiedzi i zakoń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
Powyższy skrypt tworzy serwer HTTP Swoole nasłuchujący na porcie 9501. Po otrzymaniu żądania odpowiada tekstem "Hello ServBay!", a pod ścieżką /info
wyświetla dodatkowe informacje o żądaniu.
Krok 3: Uruchomienie serwera Swoole
Upewnij się, że Twój terminal jest w katalogu servbay-swoole-http
. Użyj wybranej wersji PHP z obsługą Swoole do uruchomienia skryptu:
bash
php server.php
1
Jeśli wszystko działa poprawnie, zobaczysz w terminalu:
bash
Swoole HTTP server is started at http://0.0.0.0:9501
1
To znaczy, że serwer HTTP Swoole działa w tle i nasłuchuje na porcie 9501.
Krok 4: Testowanie serwera Swoole
Otwórz przeglądarkę i odwiedź adresy:
http://localhost:9501
http://localhost:9501/info
Powinieneś zobaczyć odpowiednio: Hello ServBay!
oraz szczegóły żądania w formie tekstowej.
Aby zatrzymać serwer, wróć do okna terminala i naciśnij Ctrl + C
.
Obsługa połączeń WebSocket w Swoole
Swoole natywnie wspiera protokół WebSocket, pozwalając łatwo tworzyć aplikacje komunikujące się w czasie rzeczywistym, jak czat, serwery gier lub systemy pushowania danych.
Krok 1: Skrypt serwera WebSocket
Stwórz nowy plik w projekcie (np. servbay-swoole-http
lub osobny katalog, np. servbay-swoole-websocket
) o nazwie websocket_server.php
i dodaj następujący kod:
Ścieżka projektu:
- macOS:
/Applications/ServBay/www/servbay-swoole-http
- Windows:
C:\ServBay\www\servbay-swoole-http
php
<?php
use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
// Tworzenie instancji serwera Swoole WebSocket
// Serwer WebSocket dziedziczy po serwerze HTTP, więc obsługuje także żądania HTTP
$server = new Server("0.0.0.0", 9502); // Nasłuchiwanie na porcie 9502
// Zdarzenie "start", wyzwalane przy starcie serwera
$server->on("start", function (Server $server) {
echo "Swoole WebSocket server is started at ws://0.0.0.0:9502\n";
});
// Zdarzenie "open"
// Wyzwalane przy każdym nowym połączeniu WebSocket
// Obiekt $request zawiera informacje o kliencie, np. $request->fd to deskryptor pliku klienta
$server->on("open", function (Server $server, Request $request) {
echo "connection open: {$request->fd}\n";
// Możesz wysłać powitalną wiadomość do klienta
$server->push($request->fd, "Welcome to ServBay WebSocket Demo!");
});
// Zdarzenie "message"
// Wyzwalane, gdy serwer otrzyma wiadomość WebSocket od klienta
// Obiekt $frame zawiera dane wiadomości, m.in. $frame->data – treść wiadomości, $frame->fd – deskryptor nadawcy
$server->on("message", function (Server $server, Frame $frame) {
echo "received message from {$frame->fd}: {$frame->data}\n";
// Przykład: odpowiedź tylko dla nadawcy
$server->push($frame->fd, "Hello, you sent: {$frame->data}");
// Przykład broadcastu (należy utrzymywać listę połączeń lub użyć pętli)
// foreach ($server->connections as $fd) {
// if ($fd != $frame->fd) {
// $server->push($fd, "User {$frame->fd} says: {$frame->data}");
// }
// }
});
// Zdarzenie "close"
// Wyzwalane przy zamknięciu połączenia przez klienta
$server->on("close", function ($ser, $fd) {
echo "connection close: {$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
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
Ten skrypt tworzy serwer WebSocket Swoole nasłuchujący na porcie 9502. Callbacki obsługują kluczowe zdarzenia: start
(uruchomienie), open
(nowe połączenia), message
(odbiór wiadomości), close
(zamknięcie połączenia). W ramach zdarzenia message
serwer odsyła otrzymaną wiadomość z prefiksem nadawcy.
Krok 2: Uruchomienie serwera WebSocket
Upewnij się, że terminal wskazuje katalog z plikiem websocket_server.php
. Uruchom skrypt:
bash
php websocket_server.php
1
Jeśli wszystko przebiegło pomyślnie, zobaczysz:
bash
Swoole WebSocket server is started at ws://0.0.0.0:9502
1
Serwer WebSocket Swoole działa i nasłuchuje na porcie 9502.
Krok 3: Połączenie z serwerem WebSocket
Do testowania serwera WebSocket masz kilka możliwości.
Metoda A: Narzędzia deweloperskie w przeglądarce
Większość nowoczesnych przeglądarek posiada panel „Konsola (Console)” lub „Sieć (Network)” (najczęściej F12), w którym można nawiązać połączenie WebSocket.
Otwórz dowolną stronę (np.
about:blank
).Przejdź do konsoli deweloperskiej.
Wklej poniższy kod JavaScript:
javascriptvar ws = new WebSocket("ws://localhost:9502"); ws.onopen = function(event) { console.log("WebSocket connection opened:", event); ws.send("Hello from Browser!"); // Po połączeniu wyślij wiadomość }; ws.onmessage = function(event) { console.log("Message from server:", event.data); // Odbiór wiadomości }; ws.onerror = function(event) { console.error("WebSocket error:", event); // Błędy połączenia }; ws.onclose = function(event) { console.log("WebSocket connection closed:", event); // Zamknięcie połączenia }; // Wiadomość możesz wysłać w dowolnym momencie przez ws.send("Twoja wiadomość") // Połączenie zamkniesz przez ws.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21Po wykonaniu kodu obserwuj reakcje w konsoli oraz w terminalu uruchomionego serwera.
Metoda B: Narzędzie wscat
wscat
to wygodny klient WebSocket pracujący w terminalu na Node.js.
Instalacja
wscat
: Jeśli nie masz Node.js i npm, najpierw je zainstaluj. Następnie zainstalujwscat
globalnie:bashnpm install -g wscat
1Połącz się z serwerem WebSocket: W terminalu wpisz:
bashwscat -c ws://localhost:9502
1Po pomyślnym połączeniu zobaczysz prompt
>
.Wyślij wiadomość: Wpisz wiadomość i zatwierdź Enterem:
bash> Hello ServBay via wscat
1Serwer zwróci odpowiedź, którą zobaczysz jako:
bash< Hello, you sent: Hello ServBay via wscat
1Jednocześnie w terminalu uruchomionego serwera pojawią się logi wiadomości.
Aby zakończyć połączenie w wscat naciśnij Ctrl + C
.
Ważne wskazówki
- Konflikty portów: Sprawdź, czy porty (np. 9501, 9502) nie są zajęte przez inne programy. W razie konfliktu Swoole nie uruchomi serwera.
- Wersja PHP: Upewnij się, że uruchamiasz skrypty z wersji PHP, która w ServBay ma włączone Swoole. Aktualną wersję sprawdzisz poleceniem
php -v
. ServBay udostępnia też wygodne narzędzie do przełączania wersji PHP w CLI. - Status rozszerzenia: Jeśli serwer Swoole nie działa, sprawdź, czy rozszerzenie jest poprawnie aktywowane dla wybranej wersji PHP w ServBay i czy po zmianie środowisko zostało zrestartowane.
- Stałe procesy: Serwer Swoole działa jako proces rezydentny. Produkcyjnie warto go nadzorować przez Supervisor, Systemd, pm2 lub inne narzędzie do zarządzania procesami, by zagwarantować automatyczne restarty i bezpieczeństwo. W lokalnym środowisku ServBay wystarcza ręczne uruchamianie w terminalu.
Podsumowanie
Z ServBay możesz w prosty sposób włączyć i używać rozszerzenie Swoole, by lokalnie budować i testować wydajne aplikacje PHP – zarówno klasyczne serwery HTTP, jak i nowoczesne usługi WebSocket. Połączenie możliwości Swoole z wygodą ServBay otwiera nowe drogi dla programistów PHP, umożliwiając budowę efektywnych, skalowalnych aplikacji. Wypróbuj Swoole w ServBay już dziś i rozwijaj swoje PHP bez ograniczeń!