Розгортання і запуск Workerman-додатків у ServBay
Огляд
Цей документ призначений для користувачів ServBay, які хочуть в локальному середовищі macOS швидко створити й запустити високопродуктивний асинхронний мережевий застосунок на базі Workerman, використовуючи вбудовані засоби PHP та Composer. Workerman — це потужна PHP-бібліотека для побудови різноманітних мережевих сервісів, що обробляють високі навантаження: вебсервери, сервери для реального часу, ігрові сервери тощо. ServBay пропонує платформу «з коробки», яка значно спрощує налаштування Workerman.
Що таке Workerman?
Workerman — це високопродуктивний асинхронний мережевий фреймворк з відкритим вихідним кодом, написаний повністю на PHP. Він базується на EventLoop (подійному циклі) та забезпечує неблокуючий I/O для ефективної обробки великої кількості одночасних з’єднань. На відміну від традиційної PHP-моделі (наприклад, Apache/Nginx + PHP-FPM), Workerman-додатки працюють у пам’яті, без постійного створення й закриття процесу після кожного запиту, що значно підвищує продуктивність і пропускну здатність.
З Workerman розробники можуть легко створювати:
- Високопродуктивні HTTP-сервери, які можуть навіть замінити Apache/Nginx для простих динамічних або статичних запитів.
- WebSocket-сервери для створення чатів, push-повідомлень у реальному часі тощо.
- TCP/UDP сервери з індивідуальними або стандартними протоколами.
- Консольні інструменти, планувальники завдань, мікросервіси і багато іншого.
Ключові можливості й переваги Workerman
- Висока продуктивність: Подієво-орієнтований та неблокуючий I/O для обробки величезної кількості з’єднань і надзвичайної продуктивності.
- Підтримка кількох протоколів: Вбудована підтримка HTTP, WebSocket, TCP, UDP та гнучкі інтерфейси для власних протоколів.
- Простота використання: Зручний і простий API, що значно спрощує асинхронне програмування для PHP-розробників.
- Гнучке розширення: Мультипроцесна модель для використання багато-ядерних CPU, гнучка інтеграція із Composer-пакетами та бібліотеками PHP.
- Інтеграція з екосистемою PHP: Дає змогу безшовно працювати з Composer і всіма сучасними поширеними бібліотеками.
- Режим демона: Підтримує роботу у фоновому режимі (daemon), що ідеально для стабільної роботи у продакшн середовищі.
Workerman відкриває світ високопродуктивних, масштабованих та реалістично-часових мережевих застосунків для PHP-розробників.
Налаштування середовища розробки Workerman у ServBay
ServBay — це професійне локальне середовище розробки для веброзробників, з підтримкою PHP, Node.js, Python, Go, Java, а також Caddy, Nginx, Apache, MySQL, PostgreSQL, MongoDB, Redis, Memcached та ін. Його головна перевага — простота запуску: Composer й PHP уже входять у базову комплектацію, що максимально спрощує старт проектів Workerman.
У цьому керівництві ми розглянемо основи налаштування Workerman у ServBay на прикладі простого HTTP-сервера, WebSocket-сервера і TCP-сервера.
TIP
Щоб структурувати ваші проєкти, ServBay рекомендує зберігати всі сайти у каталозі /Applications/ServBay/www
. Всі приклади в цій інструкції базуються на цій директорії.
Передумови
Перед початком переконайтесь, що:
- ServBay встановлено й запущено: Завантажте та встановіть останню версію з офіційного сайту ServBay.
- PHP у ServBay увімкнено: У панелі керування ServBay увімкніть потрібну версію PHP (Workerman вимагає PHP 5.4+, рекомендується PHP 7.x чи 8.x).
- Маєте базові навички PHP та роботи з терміналом: Потрібно знати основи синтаксису PHP і вміти використовувати командний рядок.
Встановлення Workerman
1. Переконайтесь, що Composer доступний
Composer уже вбудований у ServBay — додатково встановлювати нічого не потрібно. Просто переконайтесь, що ServBay запущено і потрібна версія PHP активна. Ви можете використовувати термінал ServBay або зовнішній термінал (якщо PHP та Composer додано до PATH).
Перевірити доступність Composer:
bash
composer -v
1
Якщо все налаштовано, побачите інформацію про версію Composer. Якщо команда не знайдена — перевірте, чи ServBay працює, і чи ввімкнено PHP.
2. Створіть каталог проєкту
Перейдіть до рекомендованої директорії та створіть окрему папку для проєкту:
bash
cd /Applications/ServBay/www
mkdir servbay-workerman-demo
cd servbay-workerman-demo
1
2
3
2
3
У цьому випадку проєкт називатиметься servbay-workerman-demo
.
3. Встановіть Workerman через Composer
У директорії проєкту (/Applications/ServBay/www/servbay-workerman-demo
) виконайте інсталяцію Workerman:
bash
composer require workerman/workerman
1
Composer сам завантажить Workerman та всі залежності до папки vendor
.
Приклад коду Workerman HTTP-сервера
HTTP-сервер є одним із найтиповіших варіантів використання Workerman — ідеально підходить для швидких вебзастосунків та API.
Створіть у директорії проєкту файл http_server.php
(або будь-яку іншу, наприклад, server.php
) та додайте такий PHP-код:
php
<?php
// Підключення автозавантаження Composer для використання класів Workerman
require __DIR__ . '/vendor/autoload.php';
// Імпортуємо класи Workerman
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
// Створюємо інстанс Worker, визначаючи який протокол і адресу слухати
// 'http://0.0.0.0:8080' означає HTTP-сервер, що слухає порт 8080 на всіх інтерфейсах (0.0.0.0)
// 0.0.0.0 — доступ і з локальної машини, і з мережі; 8080 — порт
$http_worker = new Worker('http://0.0.0.0:8080');
// Встановлюємо кількість воркерів (процесів)
// Наприклад, 4 — для 4 незалежних PHP-процесів; можна змінити відповідно до кількості ядер CPU
$http_worker->count = 4;
// Описуємо, що робити при отриманні HTTP-запиту клієнта
// $connection — поточне з'єднання; через нього надсилається відповідь клієнту
// $request — об'єкт із деталями запиту (URL, headers, body тощо)
$http_worker->onMessage = function(TcpConnection $connection, Request $request) {
// Відправляємо простий текст у якості HTTP-відповіді
// Workerman сам обробляє HTTP-заголовки тощо
$connection->send(new Response(200, [], 'Hello ServBay Workerman HTTP Server!'));
};
// Запуск усіх інстансів Worker
// Головний цикл Workerman: процеси починають слухати порт і обробляти події
Worker::runAll();
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
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
Пояснення коду:
require __DIR__ . '/vendor/autoload.php';
— підключає автозавантаження Composer для всіх класів Workerman.use Workerman\...;
— імпортує потрібні класи.new Worker('http://0.0.0.0:8080')
— створює HTTP-сервер, який слухає порт 8080.$http_worker->count = 4;
— визначає кількість процесів (певна відповідність ядер CPU).$http_worker->onMessage = function(...) {...};
— обробник HTTP-запитів;$connection
— канал для відповіді клієнту,$request
— дані запиту.Response
— генерація HTTP-відповіді.Worker::runAll();
— запускає подієвий цикл і всі воркери.
Запуск Workerman HTTP-сервера
У директорії проєкту (/Applications/ServBay/www/servbay-workerman-demo
) виконайте:
bash
php http_server.php start
1
Режими запуску:
- Передній план (Foreground): команда
php http_server.php start
запускає сервер у терміналі. Інформація та логи виводяться одразу; зупинка — черезCtrl+C
. Зручний спосіб для розробки. - Фоновий режим (Daemon): для продакшн режиму додайте
-d
:bashСервер працюватиме у тлі, логування — до файлу (за замовчуванням у директорії Workerman або визначеному шляху).php http_server.php start -d
1
Керування процесами:
Workerman має вбудовані команди для керування процесами:
- Запуск:
php http_server.php start
(передній план) абоphp http_server.php start -d
(фон) - Зупинка:
php http_server.php stop
(чекає завершення всіх запитів і коректно завершує роботу) - Перезапуск:
php http_server.php restart
(зупинка + запуск) - Плавне перезавантаження:
php http_server.php reload
(оновлення коду; перезапуск дочірніх процесів без переривання роботи; у разі використання функцій життєвого циклу, таких якonWorkerStart
, звертайте увагу на їхню роботу) - Статус:
php http_server.php status
(статистика: навантаження, пам’ять, кількість з’єднань тощо)
Після запуску відкрийте браузер і перейдіть на http://localhost:8080
або http://127.0.0.1:8080
. Має з’явитися Hello ServBay Workerman HTTP Server!
.
Створення WebSocket-сервера за допомогою Workerman
WebSocket дає змогу організувати постійний двосторонній канал між клієнтом і сервером, що ідеально для чатів, оновлень у реальному часі, ігор тощо. Workerman чудово з цим справляється.
Код WebSocket-сервера
Створіть файл
websocket_server.php
та додайте наступне:php<?php require __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\TcpConnection; // Створюємо WebSocket-сервер, порт 8081 // 'websocket://0.0.0.0:8081' — це WebSocket-сервер // Workerman сам здійснює handshake WebSocket $ws_worker = new Worker('websocket://0.0.0.0:8081'); // 4 процеси на сервер $ws_worker->count = 4; // Що робити при новому з'єднанні $ws_worker->onConnect = function(TcpConnection $connection) { echo "New WebSocket connection from " . $connection->getRemoteIp() . "\n"; }; // Що робити при отриманні повідомлення // $data — отримане повідомлення від клієнта $ws_worker->onMessage = function(TcpConnection $connection, $data) { echo "Received message: " . $data . "\n"; // Відправити клієнту відповідь $connection->send('ServBay Workerman received: ' . $data); }; // Подія закриття з’єднання $ws_worker->onClose = function(TcpConnection $connection) { echo "WebSocket Connection closed\n"; }; // Обробка помилок (опціонально) $ws_worker->onError = function(TcpConnection $connection, $code, $msg) { echo "Error: $code - $msg\n"; }; // Запуск воркерів Worker::runAll();
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Запуск WebSocket-сеервера
Виконайте у терміналі:
bashphp websocket_server.php start
1Також можна додати
-d
для фону. Тепер ви можете підключатись через WebSocket-клієнт на адресуws://localhost:8081
.Наприклад, у консолі браузера:
javascriptvar ws = new WebSocket("ws://localhost:8081"); ws.onopen = function(event) { console.log("WebSocket connection opened"); ws.send("Hello from Browser!"); // відправити повідомлення }; ws.onmessage = function(event) { console.log("Message from server:", event.data); // отримати відповідь }; ws.onclose = function(event) { if (event.wasClean) { console.log("WebSocket connection closed cleanly, code=" + event.code + " reason=" + event.reason); } else { console.error("WebSocket connection died"); } }; ws.onerror = function(error) { console.error("WebSocket error:", error); }; // закриття з'єднання (опціонально) // ws.close();
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Після підключення термінал покаже інформацію про підключення, а браузер отримає відповідь від Workerman.
Створення TCP-сервера з Workerman
Workerman також ідеально підходить для побудови універсальних TCP-серверів, наприклад, для ігор, IoT або спеціальних протоколів.
Код TCP-серверу
Створіть файл
tcp_server.php
і додайте:php<?php require __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\TcpConnection; // TCP-сервер на порті 8082 // 'tcp://0.0.0.0:8082' — стандартний TCP-сервер // За замовчуванням протокол Text (завершення рядка '\n'), можна змінити або реалізувати власний протокол $tcp_worker = new Worker('tcp://0.0.0.0:8082'); // 4 процеси для обробки $tcp_worker->count = 4; // При підключенні нового клієнта $tcp_worker->onConnect = function(TcpConnection $connection) { echo "New TCP connection from " . $connection->getRemoteIp() . "\n"; // Надіслати вітальне повідомлення $connection->send("Welcome to ServBay Workerman TCP Server!\n"); }; // При отриманні даних від клієнта // $data — сирі TCP-дані ( після парсингу згідно з протоколом ) $tcp_worker->onMessage = function(TcpConnection $connection, $data) { echo "Received data: " . $data; // Надіслати echo назад клієнту $connection->send('ServBay Workerman received: ' . $data); }; // Закриття з’єднання $tcp_worker->onClose = function(TcpConnection $connection) { echo "TCP Connection closed\n"; }; // Запуск воркерів Worker::runAll();
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Запуск TCP-сервера
Виконайте:
bashphp tcp_server.php start
1Можна додати
-d
для фону. Після запуску можете підключитися через TCP-клієнт доlocalhost:8082
.Наприклад, у macOS/Linux відкрийте нове вікно терміналу і використайте:
bash# через telnet telnet localhost 8082 # або через nc (netcat) nc localhost 8082
1
2
3
4
5Після встановлення з’єднання ви побачите вітання від сервера. Введіть будь-який текст (завершення — Enter) — сервер відповість вашим же повідомленням.
Важливі зауваження
- Зайняті порти: Перевірте, чи порти (8080, 8081, 8082) не зайняті іншими програмами або системою macOS. Якщо порт зайнятий — сервер не запуститься; перевірте через
lsof -i :номер_порту
. - Фаєрвол: Системний фаєрвол macOS може блокувати зовнішні підключення. Для локальної розробки проблем бути не повинно, але якщо потрібно підключення з локальної мережі — налаштуйте фаєрвол.
- Взаємодія з Caddy/Nginx ServBay: Workerman працює на власних портах і цілком незалежний від інтегрованих у ServBay Caddy чи Nginx. Ви можете використовувати їх разом (наприклад, із налаштованим реверс-проксі), але Workerman головно для асинхронних задач і довгих з'єднань, а Caddy/Nginx — для звичайних коротких HTTP-запитів.
- Версія PHP: Упевніться, що обрана версія PHP у ServBay відповідає мінімальним вимогам Workerman.
- Залежності й розширення PHP: Для продуктивної роботи Workerman бажані PHP-розширення —
event
(дає приріст продуктивності),posix
,pcntl
(для мультипроцеса). Зазвичай у ServBay вони увімкнені, але при виникненні проблем — перевірте панель керування. - Логування: У фоновому режимі всі логи Workerman — у відповідних файлах. Періодично переглядайте їх для діагностики.
Часті питання (FAQ)
- Q: Як зупинити сервер Workerman?
- A: Якщо сервер запущено у передньому плані (
start
), натиснітьCtrl+C
у терміналі. Якщо сервер у фоновому режимі (start -d
), використовуйте командуphp ваш_файл_серверу.php stop
.
- A: Якщо сервер запущено у передньому плані (
- Q: Чому не запускається сервер Workerman?
- A: Основна причина — зайнятий порт. Перегляньте повідомлення терміналу та перевірте через
lsof -i :номер_порту
. Спробуйте інший порт або завершіть процес, що його займає.
- A: Основна причина — зайнятий порт. Перегляньте повідомлення терміналу та перевірте через
- Q: У чому різниця між Caddy/Nginx ServBay та Workerman? Що краще використовувати?
- A: Caddy та Nginx — традиційні вебсервери для обробки HTTP/HTTPS запитів у зв’язці з PHP-FPM. Workerman — асинхронний фреймворк, який може діяти як HTTP-сервер, обробляти WebSocket, TCP та інші протоколи, ідеальний для довгих і паралельних з’єднань. Вибір залежить від ваших задач: класичні сайти та API — через Caddy/Nginx; чати, ігри, IoT — через Workerman (або комбіновано).
- Q: Чи можна запускати кілька Workerman-додатків одночасно в ServBay?
- A: Так! Кожен додаток запускається окремим процесом, просто впевніться, що порти не конфліктують. Запускайте кожен скрипт у власному вікні терміналу або у фоні.
Висновок
Тепер ви знаєте, як швидко і зручно розгорнути й запускати Workerman-проєкти у сучасному локальному середовищі ServBay. Workerman забезпечує PHP-розробникам потужні інструменти для створення високонавантажених, асинхронних та реалістично-часових застосунків. Використовуючи попередньо налаштоване оточення з Composer і PHP у ServBay, ви зможете зосередитись на розробці бізнес-логіки замість налаштування середовища. Для високопродуктивних Web, WebSocket, TCP-додатків ServBay стане вашим ідеальним партнером локальної розробки. Успіхів у дослідженні можливостей Workerman!