Використання Swoole у ServBay для створення високопродуктивних PHP-додатків
ServBay — це локальне середовище веб-розробки, спеціально створене для розробників. Воно постачається з попередньо інтегрованими середовищами для різних мов, базами даних і інструментами, що спрощують локальний процес розробки. У цій статті особливу увагу приділено інтеграції розширення Swoole у ServBay для надання додаткової потужності PHP-додаткам та створення високопродуктивних мережевих сервісів.
Що таке Swoole?
Swoole — це мережевий рушій для PHP, побудований на корутинах, що дозволяє обробляти паралельні та високопродуктивні комунікації. Написаний на чистій мові C, Swoole додає в PHP підтримку асинхронності, паралелізму і корутин для мережевих задач. Завдяки Swoole розробники PHP йдуть за межі класичної схеми Web-серверів (наприклад, Apache/Nginx + PHP-FPM) та обробляють високі навантаження ефективніше — будуючи постійно запущені веб-сервери, виконуючи асинхронні завдання, організовуючи реальний час комунікації (WebSocket) тощо.
Основні особливості Swoole:
- Висока продуктивність: Ядро написане на C, підтримка асинхронного I/O, багатопроцесність та багатопоточність.
- Корутини: Легковагові корутини дозволяють писати асинхронні програми у синхронному стилі, полегшуючи логіку.
- Широка підтримка протоколів: TCP/UDP/HTTP/WebSocket реалізовані "з коробки".
- Зручність: Чистий і звичний для PHP інтерфейс (API).
- Постійно запущені процеси: Додатки можуть працювати у вигляді постійно резидентних процесів, що уникає накладних витрат на ініціалізацію при кожному запиті.
Завдяки Swoole, PHP переходить із простої скриптової мови для вебу у категорію платформ для розробки складних, високопродуктивних мережевих застосунків.
Активація Swoole у ServBay
Однією з цілей ServBay є просте керування та використання PHP-розширень. Ключове сучасне розширення Swoole вже попередньо встановлене у ServBay. Його активацію можна здійснити в кілька простих кроків.
Вимоги:
- Встановлений та запущений ServBay.
- Принаймні одна версія PHP встановлена у ServBay.
Як увімкнути Swoole:
- Відкрийте інтерфейс додатку ServBay.
- Перейдіть на вкладку “Пакети (Packages)” або у менеджер версій PHP. (Залежно від версії ServBay назва може незначно відрізнятись, зазвичай знайдете це у головному вікні або в налаштуваннях.)
- Обирайте версію PHP, у якій ви хочете активувати Swoole.
- Знайдіть опцію для розширення Swoole та увімкніть її (галочкою чи перемикачем). ServBay, як правило, відображає список доступних розширень у вигляді таблиці чи перемикачів.
- Збережіть зміни та перезапустіть ServBay або відповідний PHP-сервіс за потреби. ServBay автоматично налаштує завантаження розширення Swoole у середовищі PHP.
Після цього ви вже можете використовувати Swoole у вибраній версії PHP. Для перевірки введіть у терміналі php -m
і переконайтесь, що swoole
є у списку завантажених розширень.
TIP
За замовчуванням рекомендується зберігати сайти та проектні файли у папці /Applications/ServBay/www
— це спрощує керування сайтами та конфігурацію у ServBay. У цій статті всі приклади теж будуть використовувати цей шлях.
Створення простого HTTP-сервера на Swoole
Далі ми створимо базовий HTTP-сервер Swoole і продемонструємо обробку веб-запитів.
Крок 1: Створення директорії проекту
Відкрийте термінал, створіть нову папку для проекту та перейдіть у неї. Відповідно до рекомендацій ServBay розмістіть її у /Applications/ServBay/www
:
bash
cd /Applications/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);
// Реєстрація події 'start'
// Викликається після успішного старту сервера
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
// Тут можна зберегти PID майстер-процесу, менеджер-процесу тощо
});
// Реєстрація події 'request'
// Викликається при новому HTTP-запиті
$server->on("request", function (Request $request, Response $response) {
// Встановлення HTTP-заголовка
$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 у ServBay:
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
.
Підтримка WebSocket у Swoole
Swoole підтримує протокол WebSocket на низькому рівні, що ідеально підходить для побудови чатів, ігрових серверів, сервісів реального часу тощо.
Крок 1: Створення скрипта для WebSocket-сервера
У директорії /Applications/ServBay/www/servbay-swoole-http
(або створіть окрему, наприклад servbay-swoole-websocket
) додайте файл websocket_server.php
з наступним вмістом:
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'
// Викликається при надходженні повідомлення від WebSocket-клієнта
// $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 і визначає основні події: start
(запуск), open
(з'єднання), message
(повідомлення), close
(відключення). У обробнику message
сервер повертає назад клієнту повідомлення з префіксом.
Крок 2: Запуск WebSocket-сервера
Переконайтесь, що ви перебуваєте у теці з тілом websocket_server.php
. Запустіть сервер використовуючи PHP (Swoole має бути активовано у ServBay):
bash
php websocket_server.php
1
Якщо все добре, побачите:
bash
Swoole WebSocket server is started at ws://0.0.0.0:9502
1
Це означає, що сервер слухає порт 9502.
Крок 3: Підключення до WebSocket-сервера
Є кілька способів протестувати WebSocket-сервер.
Метод А: Через інструменти браузера
Більшість сучасних браузерів (F12) мають вкладки "Network" або "Console" для тестування WebSocket.
Відкрийте будь-яку сторінку (наприклад,
about:blank
).Перейдіть у Консоль (
Console
).Введіть та виконайте наступний JavaScript-код для підключення:
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Перевірте консоль браузера і вікно терміналу з
websocket_server.php
— бачите відповідні логи.
Метод B: Через консольний інструмент wscat
wscat
— простий CLI WebSocket-клієнт на Node.js.
Встановіть
wscat
: Якщо ще немає Node.js з npm, встановіть, а потім — глобальноwscat
:bashnpm install -g wscat
1Підключіться до сервера: У терміналі введіть:
bashwscat -c ws://localhost:9502
1При успішному підключенні побачите запрошення
>
.Відправте повідомлення: Пишіть повідомлення у консоль та натискайте Enter:
bash> Hello ServBay via wscat
1Відповідь від сервера з'явиться на екрані з
<
:bash< Hello, you sent: Hello ServBay via wscat
1У терміналі, де запущено
websocket_server.php
, також будуть логи.
Щоб розірвати з'єднання з wscat — натисніть Ctrl + C
.
Важливі зауваження
- Конфлікти портів: Перевірте, що порти (наприклад 9501, 9502), які слухає Swoole, не зайняті жодною іншою службою. Якщо порт зайнятий — сервер не запуститься.
- Версія PHP: При запуску скриптів переконайтеся, що обрана версія PHP у CLI — саме та, де активовано Swoole через ServBay. Підтвердити це можна командою
php -v
. ServBay має зручний CLI-інструмент для перемикання версій PHP. - Статус розширення: Якщо сервер не стартує — перевірте ще раз, що розширення Swoole увімкнено саме для обраної версії PHP, і що ServBay або PHP-сервіс було перезапущено для застосування змін.
- Керування постійними процесами: Swoole — це постійно резидентний процес. У продакшн-середовищах його потрібно запускати під керуванням супервізорів (Supervisor, Systemd, pm2 і подібних), щоб перезапускати сервер при помилках. Для локальної розробки у ServBay досить ручного запуску у терміналі.
Висновок
Завдяки ServBay ви можете легко активувати та використовувати Swoole, розробляти й тестувати високопродуктивні PHP-додатки локально — як для класичних HTTP-сервісів, так і для сучасних WebSocket-рішень реального часу. Потужний функціонал Swoole у поєднанні з простотою середовища ServBay відкриває нові можливості PHP-розробникам та допомагає будувати ефективніші й масштабованіші проекти. Спробуйте Swoole у ServBay вже сьогодні!