Bouw High-Performance PHP Applicaties met Swoole in ServBay
ServBay is een lokaal webontwikkelplatform, speciaal ontworpen voor ontwikkelaars. Het komt voorgeïnstalleerd met diverse programmeertalen, databases en tools om je lokale ontwikkelproces te stroomlijnen. In dit artikel leggen we uit hoe je de Swoole-extensie in de ServBay-omgeving gebruikt om krachtige PHP-netwerkservices te bouwen.
Wat is Swoole?
Swoole is een op coroutines gebaseerde, parallelle en high-performance netwerkextensie voor PHP. Het is volledig geschreven in C en voorziet PHP van asynchrone, parallelle netwerkmogelijkheden via coroutines. Met Swoole kunnen PHP-ontwikkelaars de traditionele request-response-modellen van webservers (zoals Apache/Nginx + PHP-FPM) loslaten en veel efficiënter omgaan met hoge aantallen gelijktijdige verbindingen. Denk bijvoorbeeld aan het bouwen van permanente webservers, asynchrone task handlers of real-time communicatieservices zoals WebSockets.
Kernpunten van Swoole:
- Hoge prestaties: Gebouwd in C, ondersteunt asynchrone I/O, multi-proces en multi-threading.
- Coroutines: Biedt lichtgewicht coroutines waardoor asynchrone processen als 'gewone' (synchrone) code geschreven kunnen worden.
- Uitgebreide protocolondersteuning: Native support voor TCP/UDP/HTTP/WebSocket en meer.
- Gebruiksvriendelijk: Simpele API die naadloos aansluit bij PHP-conventies.
- Permanente processen: Applicaties kunnen als residentiële processen draaien, waardoor je de initiële overhead van traditionele PHP requests vermijdt.
Dankzij Swoole is PHP niet langer slechts een scripttaal voor web, maar een krachtig platform voor veeleisende netwerktoepassingen.
Swoole inschakelen in ServBay
Een van de doelen van ServBay is het makkelijk beheren en gebruiken van PHP-extensies. Swoole is een cruciale uitbreiding voor moderne high-performance PHP-ontwikkeling en is vooraf in ServBay meegeleverd. Met enkele simpele stappen kun je hem activeren:
Voorwaarden:
- ServBay is geïnstalleerd en draait.
- Minimaal één PHP-versie is in ServBay geïnstalleerd.
Stappen om te activeren:
- Open de ServBay-applicatie.
- Navigeer naar het “Pakketten (Packages)” scherm of het PHP versiebeheer. (Let op: afhankelijk van je versie, kan de benaming of locatie licht verschillen; doorgaans te vinden op het hoofdscherm of bij de instellingen)
- Selecteer de PHP-versie waar je Swoole op wilt activeren.
- Zoek de Swoole-extensie in de lijst en zet deze aan. ServBay toont meestal een lijst of schakelaars met vooraf gecompileerde extensies.
- Sla je wijzigingen op en herstart ServBay of de PHP-service indien gevraagd. ServBay zal nu automatisch je PHP-instellingen aanpassen om Swoole in te laden.
Na deze stappen kun je Swoole gebruiken in de door jou gekozen PHP-versie. Controleer dit eventueel via de terminal met php -m
— hier zou swoole
tussen de actieve extensies moeten staan.
TIP
ServBay raadt standaard aan je websites en projectbestanden te plaatsen in de map /Applications/ServBay/www
voor correcte detectie en beheer. In de voorbeelden in dit artikel houden we deze standaardmap aan.
Een eenvoudige Swoole HTTP-server bouwen
Nu gaan we een basis HTTP-server maken met Swoole om te laten zien hoe je webverzoeken kunt verwerken.
Stap 1: Maak een projectmap
Open de terminal, maak een nieuwe projectmap en navigeer erheen. Volgens ServBay’s advies plaatsen we het onder /Applications/ServBay/www
:
bash
cd /Applications/ServBay/www
mkdir servbay-swoole-http
cd servbay-swoole-http
1
2
3
2
3
Stap 2: Schrijf het server script
Maak in de map servbay-swoole-http
een bestand genaamd server.php
en voeg onderstaande code toe:
php
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
// Maak een Swoole HTTP-server instantie
// Luister op alle netwerkinterfaces (0.0.0.0), poort 9501
$server = new Server("0.0.0.0", 9501);
// Registreer de 'start' event callback
// Wordt geactiveerd wanneer de server succesvol start
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is gestart op http://0.0.0.0:9501\n";
// Je kunt hier het proces-ID van de master of manager loggen
});
// Registreer de 'request' event callback
// Wordt geactiveerd bij elke nieuwe HTTP-aanvraag
$server->on("request", function (Request $request, Response $response) {
// Stel responsheaders in
$response->header("Content-Type", "text/plain");
// Logica op basis van request-path of parameters
$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";
// Je kunt meer request-info uit het $request object halen
}
// Zend de response en beëindig het verzoek
$response->end($content);
});
// Start de server
$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
Met dit script start je een Swoole HTTP-server op poort 9501. Bij elk verzoek stuurt hij "Hello ServBay!" terug. Bezoek je /info
, dan krijg je extra requestinformatie te zien.
Stap 3: Start de Swoole-server
Zorg dat je terminal in de servbay-swoole-http
map staat. Start nu het script met de PHP-versie uit ServBay waarin Swoole is geactiveerd:
bash
php server.php
1
Als alles goed is, zie je deze melding:
bash
Swoole HTTP server is gestart op http://0.0.0.0:9501
1
Je Swoole HTTP-server draait nu en luistert op poort 9501.
Stap 4: Open je Swoole-server in de browser
Open een webbrowser en bezoek:
http://localhost:9501
http://localhost:9501/info
Je zult "Hello ServBay!" of (bij /info
) requestdetails zien.
Om de server te stoppen, ga terug naar het terminalvenster waar het script draait en druk op Ctrl + C
.
WebSocket-verbindingen verwerken met Swoole
Swoole ondersteunt WebSocket natief, perfect dus voor real-time applicaties zoals een chat, gameserver of live data push.
Stap 1: Maak het WebSocket-server script
Maak in /Applications/ServBay/www/servbay-swoole-http
(of een aparte map zoals servbay-swoole-websocket
) het bestand websocket_server.php
aan met de volgende inhoud:
php
<?php
use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
// Maak een Swoole WebSocket-server instantie
// WebSocket-server is afgeleid van HTTP-server en kan dus ook HTTP-aanvragen aan
$server = new Server("0.0.0.0", 9502); // Luistert op poort 9502
// Registreer de 'start' event, geactiveerd bij serverstart
$server->on("start", function (Server $server) {
echo "Swoole WebSocket server is gestart op ws://0.0.0.0:9502\n";
});
// Registreer de 'open' event
// Wordt geactiveerd als een nieuwe WebSocket-verbinding tot stand komt
// $request bevat clientinformatie, zoals $request->fd: de client file descriptor
$server->on("open", function (Server $server, Request $request) {
echo "verbinding geopend: {$request->fd}\n";
// Je kunt een welkomstbericht naar de client sturen
$server->push($request->fd, "Welkom bij de ServBay WebSocket Demo!");
});
// Registreer de 'message' event
// Wordt geactiveerd als de server een bericht ontvangt van de client
// $frame bevat o.a. de data en $frame->fd de bronclient
$server->on("message", function (Server $server, Frame $frame) {
echo "ontvangen bericht van {$frame->fd}: {$frame->data}\n";
// Stuur terug naar de afzender
$server->push($frame->fd, "Hallo, je stuurde: {$frame->data}");
// Voorbeeld van broadcast (extra logica nodig voor lijst van connecties)
// foreach ($server->connections as $fd) {
// if ($fd != $frame->fd) { // Niet terugsturen naar de afzender
// $server->push($fd, "Gebruiker {$frame->fd} zegt: {$frame->data}");
// }
// }
});
// Registreer de 'close' event
// Wordt geactiveerd als een client de verbinding sluit
$server->on("close", function ($ser, $fd) {
echo "verbinding gesloten: {$fd}\n";
});
// Start de server
$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
Dit script start een Swoole WebSocket-server op poort 9502. Er zijn callbacks voor ‘start’ (server gestart), ‘open’ (nieuwe verbinding), ‘message’ (ontvangst bericht), en ‘close’ (verbinding gesloten). Bij ‘message’ krijgt de afzender een bevestiging terug.
Stap 2: Start de WebSocket-server
Zorg dat je terminal in de juiste map staat en start het script:
bash
php websocket_server.php
1
Bij een goede start zie je:
bash
Swoole WebSocket server is gestart op ws://0.0.0.0:9502
1
De WebSocket-server draait en luistert nu op poort 9502.
Stap 3: Koppel naar de WebSocket-server
Je kunt de verbinding op verschillende manieren testen:
Methode A: Met browser ontwikkelaarstools
De meeste moderne browsers beschikken over een “Netwerk” of “Console” paneel om WebSocket te testen.
Open een willekeurige pagina (bijvoorbeeld
about:blank
).Open de devtools (F12), en ga naar het Console-venster.
Plak en voer deze JavaScript uit om verbinding te maken:
javascriptvar ws = new WebSocket("ws://localhost:9502"); ws.onopen = function(event) { console.log("WebSocket-verbinding geopend:", event); ws.send("Hallo vanuit de browser!"); // Stuur een bericht bij verbinding }; ws.onmessage = function(event) { console.log("Bericht van server:", event.data); // Ontvang serverbericht }; ws.onerror = function(event) { console.error("WebSocket-fout:", event); // Foutmelding }; ws.onclose = function(event) { console.log("WebSocket-verbinding gesloten:", event); // Verbinding verbroken }; // Je kunt altijd ws.send("je bericht") sturen of ws.close() aanroepen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20Bekijk de resultaten in de console en zie ook de serverlogs in het venster van
websocket_server.php
.
Methode B: Met de wscat
commandoregel tool
wscat
is een handige CLI WebSocket client, gebaseerd op Node.js.
Installeer
wscat
: Indien je Node.js & npm nog niet hebt:bashnpm install -g wscat
1Verbind met de WebSocket-server:
bashwscat -c ws://localhost:9502
1Na verbinding zie je de prompt
>
.Stuur een bericht:
bash> Hello ServBay via wscat
1De server antwoordt, zichtbaar als
<
:bash< Hallo, je stuurde: Hello ServBay via wscat
1Check ook de logs van je
websocket_server.php
.
Verbreek de verbinding door Ctrl + C
te drukken.
Aandachtspunten
- Poortconflicten: Zorg ervoor dat de poorten (zoals 9501, 9502) niet in gebruik zijn door andere apps. Anders start de Swoole-server niet.
- PHP-versie: Zorg dat je scripts draait met die PHP-versie waarin Swoole in ServBay geactiveerd is. Controleer met
php -v
welke versie je gebruikt. ServBay biedt doorgaans een tool om tussen PHP-versies te wisselen. - Extensie-status: Lukt het starten niet, verifieer dan of Swoole écht geactiveerd is voor de gebruikte PHP, en herstart ServBay of de PHP-service.
- Procesbeheer: Swoole-servers zijn residentieel en blijven dus draaien. In productie kun je tools als Supervisor, Systemd of pm2 gebruiken voor automatische herstart na crashes. Voor lokale ServBay-ontwikkeling is handmatig starten via de terminal meestal voldoende.
Samenvatting
Met ServBay kun je eenvoudig de Swoole-extensie activeren, zodat je in je lokale omgeving moderne high-performance PHP-applicaties ontwikkelt en test — van klassieke HTTP-servers tot advanced WebSocket real-time applicaties. Swoole en het gebruiksgemak van ServBay openen nieuwe kansen voor PHP-developers om sneller robuuste en efficiënte projecten te realiseren. Probeer Swoole vandaag nog uit in ServBay!