Використання Swoole у ServBay для створення високопродуктивних PHP-додатків
ServBay — це локальне веб-середовище розробки, спеціально розроблене для девелоперів. Воно містить інтеграцію з багатьма мовними середовищами, базами даних і інструментами, спрощуючи процес розробки на локальному комп’ютері. У цій статті ми докладно розглянемо, як скористатися розширенням Swoole для підвищення продуктивності PHP-додатків у середовищі ServBay.
Що таке Swoole?
Swoole — це корутинний (Coroutine), паралельний і високопродуктивний мережевий рушій для PHP. Він написаний на чистому C і дає PHP асинхронні, паралельні та корутинні можливості для роботи з мережею. Завдяки Swoole, розробники PHP можуть забути про обмеження традиційної моделі запит-відповідь (наприклад, Apache/Nginx + PHP-FPM) та ефективніше обробляти високо-одночасні завдання: створювати постійно працюючі веб-сервери, виконувати асинхронні операції, реалізувати реальнісчасні повідомлення через WebSocket тощо.
Основні переваги Swoole:
- Висока продуктивність: Низькорівнева реалізація на C, асинхронний I/O, підтримка багатопоточності та багатопроцесності.
- Корутини: Легковагові корутини для асинхронного виконання коду в синхронному стилі, що спрощує написання асинхронних програм.
- Підтримка різних протоколів: Вбудована підтримка TCP, UDP, HTTP, WebSocket та інших мережевих протоколів.
- Зручність використання: Простий API у стилі PHP.
- Постійна робота в пам’яті: Додаток може працювати як постійний процес, мінімізуючи витрати на ініціалізацію при кожному запиті.
Завдяки Swoole, PHP перетворюється із простої скриптової мови для веб-розробки на рушій для високопродуктивних мережевих застосунків.
Як увімкнути Swoole у ServBay
Одна з цілей ServBay — надати легке керування PHP-розширеннями для розробників. Swoole, як важливий компонент для сучасної продуктивної PHP-розробки, вже входить до складу ServBay. Вам потрібно виконати прості кроки для його активації.
Перед початком:
- Переконайтеся, що ServBay встановлено та запущено.
- В ServBay має бути встановлено хоча б одну версію PHP.
Кроки активації:
- Відкрийте інтерфейс програми ServBay.
- Перейдіть до розділу “Пакети (Packages)” або до менеджера версій PHP. (Примітка: точна назва розділу залежить від версії ServBay, як правило — це головний екран або налаштування)
- Виберіть версію PHP, для якої хочете увімкнути Swoole.
- Знайдіть у списку розширень Swoole та позначте опцію активації. ServBay зазвичай показує доступні розширення у вигляді списку або перемикачів.
- Збережіть зміни й перезапустіть ServBay або відповідну службу PHP згідно з підказками. ServBay автоматично налаштує оточення PHP для завантаження Swoole.
Після виконання цих дій Swoole буде доступний у вибраній версії PHP. Перевірити це можна через команду php -m
— у списку завантажених розширень має з’явитися swoole
.
TIP
За замовчуванням ServBay рекомендує зберігати сайти та проектні файли у таких папках — це спрощує керування сайтами та конфігурації:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
Приклад у цій статті використовує ці директорії.
Створення простого HTTP-сервера на Swoole
Далі створимо базовий Swoole HTTP-сервер для обробки веб-запитів.
Крок 1: Створіть директорію проекту
Відкрийте термінал, створіть та перейдіть у нову папку проекту згідно рекомендацій 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
Крок 2: Напишіть скрипт сервера
У папці servbay-swoole-http
створіть файл server.php
із таким вмістом:
php
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
// Створити екземпляр Swoole HTTP-сервера
// Слухає всі мережеві інтерфейси (0.0.0.0) на порті 9501
$server = new Server("0.0.0.0", 9501);
// Реєстрація callback-функції на подію 'start'
// Викликається при успішному запуску сервера
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
// Тут можна записати ідентифікатор головного процесу, менеджера тощо
});
// Реєстрація callback-функції на подію 'request'
// Викликається при отриманні нового HTTP-запиту
$server->on("request", function (Request $request, Response $response) {
// Встановити заголовок відповіді
$response->header("Content-Type", "text/plain");
// Обробка за шляхом чи параметрами запиту
$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";
// Більше інформації про запит доступно через об’єкт $request
}
// Надіслати відповідь та завершити запит
$response->end($content);
});
// Запустити сервер
$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
Цей скрипт створює HTTP-сервер Swoole на порту 9501, який відповідає простим текстовим повідомленням "Hello ServBay!". Якщо звернутися до шляху /info
, сервер поверне інформацію про запит.
Крок 3: Запуск сервера Swoole
Переконайтесь, що у вашому терміналі відкрито папку servbay-swoole-http
. Запустіть скрипт за допомогою PHP-версії із активованим Swoole:
bash
php server.php
1
Якщо все пройшло успішно, у терміналі ви побачите:
bash
Swoole HTTP server is started at http://0.0.0.0:9501
1
Це означає, що сервер працює у фоновому режимі на порту 9501.
Крок 4: Доступ до сервера Swoole
Відкрийте веб-браузер та перейдіть за адресою:
http://localhost:9501
http://localhost:9501/info
У відповідь буде виведено Hello ServBay!
та інформацію про запит залежно від шляху.
Щоб зупинити сервер, поверніться у термінал та натисніть Ctrl + C
.
Використання Swoole для WebSocket-з’єднань
Swoole має вбудовану підтримку WebSocket-протоколу, що дозволяє легко створювати чати, гейм-сервери чи служби для миттєвої доставки даних.
Крок 1: Створіть скрипт WebSocket-сервера
У вашій директорії (servbay-swoole-http
або новій, наприклад, servbay-swoole-websocket
) створіть файл websocket_server.php
:
Шлях проекту:
- 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;
// Створити екземпляр Swoole WebSocket-сервера
// WebSocket-сервер наслідує HTTP-сервер, може обробляти HTTP-запити
$server = new Server("0.0.0.0", 9502); // Слухає порт 9502
// Реєстрація події 'start', викликається при старті сервера
$server->on("start", function (Server $server) {
echo "Swoole WebSocket server is started at ws://0.0.0.0:9502\n";
});
// Реєстрація події 'open'
// Викликається при встановленні нового WebSocket-з’єднання
// Об’єкт $request містить інформацію про підключення, $request->fd — файловий дескриптор клієнта
$server->on("open", function (Server $server, Request $request) {
echo "connection open: {$request->fd}\n";
// Відправити привітальне повідомлення клієнту
$server->push($request->fd, "Welcome to ServBay WebSocket Demo!");
});
// Реєстрація події 'message'
// Викликається при отриманні повідомлення від клієнта
// Об’єкт $frame містить саму інформацію: $frame->data — дані повідомлення, $frame->fd — дескриптор клієнта
$server->on("message", function (Server $server, Frame $frame) {
echo "received message from {$frame->fd}: {$frame->data}\n";
// Надіслати відповідь клієнту або всієї аудиторії (бродкаст)
// Відправка відповіді відправнику
$server->push($frame->fd, "Hello, you sent: {$frame->data}");
// Бродкаст-приклад (потрібно підтримувати список підключень)
// foreach ($server->connections as $fd) {
// if ($fd != $frame->fd) { // Не відправляти самому відправнику
// $server->push($fd, "User {$frame->fd} says: {$frame->data}");
// }
// }
});
// Реєстрація події 'close'
// Викликається, коли клієнт розриває з’єднання
$server->on("close", function ($ser, $fd) {
echo "connection close: {$fd}\n";
});
// Запустити сервер
$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
Цей скрипт створює WebSocket-сервер Swoole на порту 9502 та визначає кілька важливих callback-функцій для подій: запуск сервера, встановлення з’єднання, отримання повідомлення, закриття з’єднання. На подію message
сервер відповідає відправнику його власною фразою із префіксом.
Крок 2: Запуск WebSocket-сервера
Відкрийте термінал та перейдіть у папку з вашим websocket_server.php
. Запустіть скрипт за допомогою PHP-версії із активованим Swoole:
bash
php websocket_server.php
1
Якщо сервер стартував — ви побачите:
bash
Swoole WebSocket server is started at ws://0.0.0.0:9502
1
Сервер працює на порту 9502.
Крок 3: Підключення до WebSocket-сервера
Ви можете протестувати сервер декількома способами.
Спосіб A: За допомогою інструментів розробника браузера
У більшості сучасних браузерів (F12) є вкладки "Network" або "Console", через які можна протестувати WebSocket.
Відкрийте будь-яку сторінку, наприклад
about:blank
.Перейдіть у "Консоль" (Console).
Вставте та запустіть JS-код для підключення:
javascriptvar ws = new WebSocket("ws://localhost:9502"); ws.onopen = function(event) { console.log("WebSocket connection opened:", event); ws.send("Hello from Browser!"); // Відправлення повідомлення після підключення }; ws.onmessage = function(event) { console.log("Message from server:", event.data); // Отримання повідомлення }; ws.onerror = function(event) { console.error("WebSocket error:", event); // Обробка помилок }; ws.onclose = function(event) { console.log("WebSocket connection closed:", event); // З’єднання закрито }; // Для надсилання: ws.send("ваше повідомлення") // Для завершення: ws.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21Слідкуйте за повідомленнями у консолі та журналом у терміналі сервера.
Спосіб B: Використання CLI-утиліти wscat
wscat
— це зручний клієнт WebSocket для терміналу на базі Node.js.
Встановіть
wscat
: Якщо у вас нема Node.js і npm — спочатку встановіть їх, потім глобально встановітьwscat
:bashnpm install -g wscat
1Підключіться до WebSocket-сервера:
bashwscat -c ws://localhost:9502
1Успішне підключення покаже запрошення
>
.Надіслати повідомлення: Просто введіть текст і натисніть Enter:
bash> Hello ServBay via wscat
1У відповідь у терміналі утиліти з’явиться повідомлення із
<
:bash< Hello, you sent: Hello ServBay via wscat
1Також у терміналі сервера буде відповідний журнал.
Для виходу із wscat
натисніть Ctrl + C
.
Важливі зауваження
- Конфлікт портів: Переконайтеся, що порти (9501, 9502) не зайняті іншими програмами. У разі конфлікту сервер Swoole не запуститься.
- Версія PHP: Слід запускати скрипти з PHP-версією, де Swoole активовано. Перевірити поточну версію можна командою
php -v
. ServBay зазвичай має утиліту для швидкої зміни PHP-версії. - Стан розширення: Якщо сервер не запускається, переконайтеся, що Swoole увімкнено у потрібній версії PHP та весь сервіс перезапущено.
- Постійні процеси: Сервер Swoole — це постійний процес у пам’яті. Для продакшн-середовища потрібен процес-менеджер (Supervisor, Systemd, pm2), щоб сервер перезапускався після збоїв. На локальному ПК можна вручну запускати його у терміналі.
Висновок
Завдяки ServBay ви легко активуєте та використовуєте розширення Swoole, створюючи і тестуючи високопродуктивні PHP-додатки локально — як класичні HTTP-служби, так і сучасні WebSocket-аплікації для реального часу. Можливості Swoole у поєднанні із зручним середовищем ServBay відкривають нові горизонти для PHP-розробників, дозволяючи створювати потужні та ефективні проекти. Спробуйте Swoole вже сьогодні у ServBay!