Розгортання та запуск Workerman-додатків у ServBay
Огляд
Цей документ допоможе користувачам ServBay швидко створити і запустити високопродуктивні асинхронні мережеві додатки на основі Workerman у локальному розробницькому середовищі macOS та Windows. Завдяки інтегрованому PHP та Composer ви зможете без зайвих налаштувань працювати з Workerman — потужною PHP-бібліотекою для створення високонавантажених мережевих сервісів, таких як Web-сервери, сервери для онлайн-комунікації, геймінгу тощо. ServBay — це платформа "з коробки", яка значно спрощує процес підготовки оточення для Workerman.
Що таке Workerman?
Workerman — це повністю написаний на PHP open-source асинхронний мережевий фреймворк із високою продуктивністю. Він базується на EventLoop (циклі подій) та не блокує I/O, що дозволяє оперативно обробляти тисячі одночасних з’єднань. На відміну від традиційної моделі (як Apache/Nginx + PHP-FPM), Workerman працює у постійному режимі в пам’яті, слухає вибраний порт і безпосередньо обробляє мережеві дані. Це мінімізує накладні витрати, пов’язані із запуском і зупинкою процесів при кожному запиті, і дає значний приріст продуктивності й пропускної здатності.
За допомогою Workerman ви легко зможете створювати:
- Високопродуктивний HTTP-сервер (може працювати замість Apache/Nginx при простих запитах).
- Сервер реального часу на WebSocket — чат, push-повідомлення тощо.
- TCP/UDP-сервери із власними протоколами.
- Консольні утиліти, cron-задачі, мікросервіси.
Ключові переваги Workerman
- Висока продуктивність: Асинхронна неблокуюча обробка запитів на основі подієвого циклу, що дає змогу обслуговувати тисячі підключень.
- Підтримка багатьох протоколів: Вбудована робота з HTTP, WebSocket, TCP, UDP + можливість додавати власні протоколи.
- Простота використання: Зрозумілий API, швидкий старт для PHP-розробників.
- Гнучка масштабованість: Мультипроцесорна архітектура для максимальної ефективності на багатоядерних CPU; Composer-пакети та інші PHP-бібліотеки можуть легко інтегруватись.
- Повна інтеграція PHP-екосистеми: Як звичайна PHP-бібліотека, працює у зв’язці з Composer та іншими інструментами PHP.
- Daemon-режим: Сервіс можна стабільно запускати у фоновому режимі як демон, що ідеально підходить для продуктивних оточень.
Workerman відкриває перед PHP-розробниками можливість створювати сучасні високопродуктивні та реальні-time мережеві додатки.
Розгортання Workerman в середовищі ServBay
ServBay — це локальне середовище для веб-розробників із готовими інтеграціями для PHP, Node.js, Python, Go, Java, а також з популярними серверами та базами даних (Caddy, Nginx, Apache, MySQL, PostgreSQL, MongoDB, Redis, Memcached тощо). Його головна перевага — "готовність з коробки", включаючи налаштований Composer, що значно полегшує запуск Workerman-проектів.
У цьому гайді, на прикладі простого HTTP-сервера, WebSocket-сервера і TCP-сервера, показано, як швидко розгорнути та запустити Workerman-додатки у ServBay.
TIP
Задля оптимального управління файлами проектів ServBay рекомендує зберігати усі локальні проекти у наступних каталогах:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
Усі приклади шляхів у цьому документі вказуються відносно цих директорій.
Передумови
Впевніться, що:
- ServBay встановлений і працює: Завантажте останню версію з офіційного сайту.
- PHP активовано у ServBay: У панелі керування ServBay переконайтеся, що потрібна версія PHP активна. Workerman підтримує PHP 5.4+, але рекомендовано PHP 7.x або 8.x.
- Ви володієте базовими знаннями PHP та роботи з терміналом.
Встановлення Workerman
1. Перевірка Composer
Composer попередньо встановлено в ServBay. Переконайтеся, що PHP та ServBay запущено, і ви використовуєте потрібну версію PHP. Composer буде автоматично прив'язаний до активної версії PHP.
У терміналі введіть команду для перевірки Composer:
bash
composer -v
1
Якщо Composer встановлено правильно, ви побачите інформацію про версію. Якщо команда не знайдена — перевірте, чи запущено ServBay, і чи PHP активний.
2. Створіть директорію проекту
Перейдіть до рекомендованої кореневої папки сайтів ServBay і створіть новий каталог для проекту, після чого зайдіть до нього:
macOS:
bash
cd /Applications/ServBay/www
mkdir servbay-workerman-demo
cd servbay-workerman-demo
1
2
3
2
3
Windows:
cmd
cd C:\ServBay\www
mkdir servbay-workerman-demo
cd servbay-workerman-demo
1
2
3
2
3
Так ви створите папку servbay-workerman-demo
для проекту Workerman.
3. Встановлення Workerman через Composer
У каталозі проекту виконайте установку бібліотеки Workerman із допомогою Composer (рекомендований спосіб):
Шлях проекту:
- macOS:
/Applications/ServBay/www/servbay-workerman-demo
- Windows:
C:\ServBay\www\servbay-workerman-demo
bash
composer require workerman/workerman
1
Усі файли будуть завантажені до каталогу vendor
вашого проекту.
Написання коду HTTP-сервера Workerman
HTTP-сервер — це базовий сценарій застосування Workerman, і він чудово підходить для створення швидких веб- та API-сервісів.
Створіть файл http_server.php
(або будь-який інший, наприклад server.php
) у каталозі проекту та додайте наступний PHP-код:
php
<?php
// Підключення файлу автозавантаження Composer для доступу до класів Workerman
require __DIR__ . '/vendor/autoload.php';
// Імпорт класу Worker 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 дозволяє підключати і з локального комп’ютера, і з LAN; 8080 — порт для прослуховування
$http_worker = new Worker('http://0.0.0.0:8080');
// Вказати кількість процесів для Worker
// Тут — 4, тобто буде створено чотири незалежних процеси PHP для обробки запитів (можна змінити під кількість ядер)
$http_worker->count = 4;
// Вказати логіку обробки HTTP-запиту від клієнта
// $connection — об’єкт з’єднання, використовується для відповіді клієнту
// $request — об'єкт запиту, містить інформацію про URL, Header, Body тощо
$http_worker->onMessage = function(TcpConnection $connection, Request $request) {
// Відправити клієнту простий HTTP-респонс
// HTTP-заголовки формуються автоматично
$connection->send(new Response(200, [], 'Hello ServBay Workerman HTTP Server!'));
};
// Запуск усіх екземплярів Worker
// Запуск основного циклу Workerman, після чого Worker почнуть обробку подій
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-сервер на обраному порту.$http_worker->count = 4;
: Встановлює кількість процесів для навантаження на багатоядерні процесори.$http_worker->onMessage = function(TcpConnection $connection, Request $request) { ... };
: Логіка обробки HTTP-запиту; через$connection
відправляється відповідь клієнту;$request
містить дані запиту. КласResponse
формує коректний HTTP-респонс.Worker::runAll();
: Запускає цикл Workerman та активує процеси для роботи.
Запуск HTTP-сервера Workerman
У каталозі проекту відкрийте термінал і запустіть сервер командою:
Каталог проекту:
- macOS:
/Applications/ServBay/www/servbay-workerman-demo
- Windows:
C:\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
- Плавний перезапуск (Reload):
php http_server.php reload
(оновлення коду без зупинки сервісу, з урахуванням callback-функцій типуonWorkerStart
) - Перегляд статусу:
php http_server.php status
(інформація про процеси, використання пам’яті, з’єднання тощо)
Після запуску відкрийте браузер і зайдіть на http://localhost:8080
або http://127.0.0.1:8080
. Ви побачите повідомлення: Hello ServBay Workerman HTTP Server!
.
Створення WebSocket-сервера на Workerman
WebSocket дозволяє встановлювати постійне двостороннє з’єднання між клієнтом і сервером — ідеально для чатів, push, ігор тощо. Workerman має потужну інтеграцію WebSocket.
Код 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 процеси для обробки кoннектів $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"; // Відправити клієнту відповідь (echo) $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’ів 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Запуск WebSocket-сервера
У каталозі проекту запустіть сервер:
bashphp websocket_server.php start
1Можна додати
-d
для фону. Для тестування — підключіться доws://localhost:8081
через WebSocket-клієнти.Наприклад, у браузері через Console:
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При успішному підключенні у терміналі буде видимий лог; повідомлення буде виводитись, і клієнт отримає echo-відповідь.
Запуск TCP-сервера на Workerman
Workerman може працювати і як TCP-сервер для обробки даних на рівні TCP — ідеально для backend-ігр, 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-сервера // За замовчуванням використовується текстовий протокол (кінець рядка '\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"; // Відправити welcome-повідомлення при підключенні $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’ів 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
для запуску у фоновому режимі. Для підключення — використайте telnet чи nc:bash# Підключення через telnet telnet localhost 8082 # Або через nc (netcat) nc localhost 8082
1
2
3
4
5Після підключення отримаєте привітальне повідомлення; введіть дані — вони будуть повернуті (echo).
Важливі нюанси
- Зайнятість портів: Переконайтесь, що порти (8080, 8081, 8082) не зайняті системою або іншими програмами ServBay. Для перевірки — команда
lsof -i :номер_порту
. - Брандмауер: Локальні фаєрволи можуть блокувати вихід на потрібні порти. Для тестів на локальній машині проблем немає, але якщо потрібно підключення з LAN — відкрийте порти у налаштуваннях ОС.
- Взаємодія з веб-серверами ServBay: Workerman працює незалежно на своїх портах, окремо від Caddy/Nginx, які входять в ServBay. Додатки Workerman самі обробляють підключення, без проксі (окрім спеціальної конфігурації). Workerman — ідеальний для long-polling, WebSocket/реальних час-запитів; Caddy/Nginx — для класичних коротких HTTP-запитів.
- Версія PHP: Переконайтесь, що PHP у ServBay відповідає вимогам Workerman. Вибирайте підходящу версію у панелі керування.
- PHP-розширення: Для максимальної продуктивності Workerman використовує розширення PHP, такі як
event
,posix
,pcntl
. В ServBay більшість розширень вже активовані, але якщо виникнуть проблеми — перевірте, чи вони включені. - Логи: У режимі демона логи зберігаються у файли. Періодично перевіряйте їх на предмет помилок і стану додатку.
Часті запитання (FAQ)
- Q: Як зупинити сервер Workerman?
- A: Якщо сервер працює на передньому плані (
start
), натиснітьCtrl+C
у терміналі. Якщо запущено у фоні (start -d
), зупиніть командоюphp your_server_file.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, постійно знаходиться у пам’яті, ідеально для high-concurrent, long-lived підключень. Вибір залежить від задач: для класичних сайтів та REST API — Caddy/Nginx, для realtime-чату, ігор, IoT — Workerman. Можлива і комбінована архітектура (наприклад, проксірефераль через Caddy/Nginx на Workerman).
- Q: Чи можна одночасно запускати декілька Workerman-додатків у ServBay?
- A: Так. Кожен додаток запускається у своєму процесі, на власному порту. Просто напишіть окремий скрипт запуску для кожного додатка й запустіть його у терміналі (або у фоні). Всі порти повинні бути унікальні.
Підсумок
Тепер ви знаєте, як швидко створити та запустити Workerman-проекти у сучасному локальному середовищі ServBay. Workerman — це потужний інструмент для PHP-розробки високонавантажених додатків, а ServBay спрощує всі процеси конфігурації та запуску. Завдяки інтегрованим Composer і PHP ви можете сфокусуватись лише на бізнес-логіці Workerman-сервера, не витрачаючи час на інженерні налаштування. Що б ви не розробляли — високопродуктивний Web/API-сервер чи realtime WebSocket-додаток — ServBay стане вашим ідеальним локальним партнером для роботи з Workerman. Бажаємо успіхів у дослідженні сучасних PHP-мережевих технологій!