Развертывание и запуск приложений Workerman в ServBay
Введение
Данный документ предназначен для пользователей ServBay и подробно рассказывает, как легко и быстро развернуть высокопроизводительные асинхронные сетевые приложения на основе Workerman в локальной среде разработки macOS и Windows, используя интегрированные PHP и Composer. Workerman — мощная PHP-библиотека для построения сетевых сервисов с высокой нагрузкой, таких как веб-серверы, серверы реального времени, игровые серверы и др. ServBay предоставляет платформу “из коробки”, максимально упрощая настройку окружения для Workerman.
Что такое Workerman?
Workerman — это полностью написанный на PHP открытый фреймворк для асинхронной сетевой связи с высокой производительностью. Он построен на событийном цикле (EventLoop) и реализует асинхронный неблокирующий I/O, позволяя обслуживать большое количество одновременных подключений. В отличие от классической модели PHP (Apache/Nginx + PHP-FPM), приложения Workerman работают как постоянно запущенные процессы, слушающие определённый порт и напрямую обрабатывающие сетевые подключения и данные. Это исключает затраты на запуск и завершение процесса для каждого запроса, существенно повышая производительность и скорость отклика.
С помощью Workerman разработчики могут легко создавать:
- Высокопроизводительные HTTP-серверы, которые способны заменять Apache/Nginx для обработки статических и динамических запросов.
- Серверы WebSocket для реализации чатов, онлайн-оповещений, стриминга данных и других real-time сервисов.
- Пользовательские сервера TCP/UDP для любых протоколов и задач.
- Консольные утилиты, задачи по расписанию, микросервисы и многое другое.
Ключевые особенности и преимущества Workerman
- Высокая производительность: Событийная архитектура и асинхронный I/O позволяют обслуживать тысячи и десятки тысяч одновременных соединений.
- Поддержка множества протоколов: Встроенная поддержка HTTP, WebSocket, TCP, UDP и простой механизм расширения для пользовательских протоколов.
- Простота использования: Чистый и понятный API избавляет от сложностей асинхронного программирования, PHP-разработчики осваивают Workerman быстро.
- Гибкая масштабируемость: Много-процессная модель позволяет эффективно использовать многоядерные процессоры для горизонтального масштабирования и балансировки нагрузки. Легкая интеграция Composer-пакетов и существующих библиотек PHP.
- Интеграция с PHP-экосистемой: Как PHP-библиотека, Workerman отлично сочетается с существующими инструментами и Composer для управления зависимостями.
- Режим демона: Поддержка работы в фоне в качестве демона, что делает Workerman надёжным для production-окружения.
Workerman открывает перед PHP-разработчиками возможности для создания масштабируемых, real-time и высоконагруженных сетевых сервисов.
Быстрый старт: развертывание среды разработки Workerman в ServBay
ServBay — профессиональная локальная среда разработки, которая включает PHP, Node.js, Python, Go, Java и множество популярных баз данных и серверов: Caddy, Nginx, Apache, MySQL, PostgreSQL, MongoDB, Redis, Memcached и др. Главная особенность — готовность к работе из коробки, включая заранее настроенную среду Composer, что существенно ускоряет старт проектов на Workerman.
В этом руководстве мы покажем простые примеры создания и запуска Workerman-приложений в ServBay: HTTP-сервер, WebSocket-сервер и TCP-сервер.
TIP
Для удобной организации рекомендуется хранить все файлы локальных сайтов ServBay в следующих директориях:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
Все примеры в документе предполагают именно этот путь.
Предварительные требования
Перед стартом убедитесь, что:
- ServBay установлен и запущен: Скачайте и установите последнюю версию с официального сайта ServBay.
- PHP включён в ServBay: В панели управления ServBay включите нужную версию PHP. Требуется PHP 5.4+, оптимально — PHP 7.x или 8.x.
- Базовые знания PHP и командной строки: Вам понадобятся базовые навыки написания кода на PHP и работы с терминалом.
Установка Workerman
1. Проверка Composer
Composer уже встроен в ServBay, устанавливать дополнительно не требуется. Просто убедитесь, что ServBay запущен и активна нужная версия PHP. Composer автоматически корректно настроен под выбранную версию PHP.
Откройте терминал и проверьте Composer командой:
bash
composer -v
1
Если всё настроено, увидите номер версии Composer. Если команда не распознается, проверьте работу ServBay и активность PHP.
2. Создание каталога проекта
Перейдите в рекомендованную директорию и создайте новый каталог для проекта:
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:
Путь к проекту:
- macOS:
/Applications/ServBay/www/servbay-workerman-demo
- Windows:
C:\ServBay\www\servbay-workerman-demo
bash
composer require workerman/workerman
1
Composer скачает Workerman и нужные зависимости в папку vendor
.
Пример HTTP-сервера Workerman
HTTP-сервер — одна из самых популярных реализаций Workerman, подходит для API и веб-приложений.
Создайте файл http_server.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, доступен из локальной сети
$http_worker = new Worker('http://0.0.0.0:8080');
// Количество дочерних процессов
// Установлено 4, рекомендуется подбирать по количеству ядер CPU
$http_worker->count = 4;
// Обработка входящих HTTP-запросов
// $connection — объект соединения, для ответа клиенту
// $request — объект запроса с данными URL, заголовками и телом
$http_worker->onMessage = function(TcpConnection $connection, Request $request) {
// Отправляем простой текстовый ответ клиенту
// Workerman автоматически добавляет правильные заголовки HTTP
$connection->send(new Response(200, [], 'Hello ServBay Workerman HTTP Server!'));
};
// Запуск 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
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
Пояснения к коду:
require __DIR__ . '/vendor/autoload.php';
: загружает автозагрузчик Composer и все необходимые классы Workerman.use Workerman\...;
: импортирует классы.new Worker('http://0.0.0.0:8080')
: создаёт экземпляр Workerman для HTTP на порту 8080, слушает все сетевые интерфейсы.$http_worker->count = 4;
: количество процессов (на производительность влияет число ядер).$http_worker->onMessage = function(...) { ... }
: функция-обработчик входящего HTTP-запроса, отправляет стандартный ответ через объектResponse
.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Сервер перейдет в фон, логи пишутся в файл (по умолчанию в папке проекта или заданной).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
(поочередный рестарт дочерних процессов, без прерывания сервиса) - Статус:
php http_server.php status
(показывает состояние процессов, загрузку памяти, число соединений и др.)
После запуска откройте браузер: http://localhost:8080
или http://127.0.0.1:8080
. На странице отобразится Hello ServBay Workerman HTTP Server!
.
Создание WebSocket-сервера Workerman
WebSocket обеспечивает двустороннюю связь между клиентом и сервером, подходит для real-time приложений (чаты, оповещения, онлайн-игры). Workerman “из коробки” поддерживает WebSocket.
Напишите код WebSocket-сервера
Создайте файл
websocket_server.php
с таким содержимым:php<?php require __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\TcpConnection; // Создание WebSocket-сервера на порту 8081 // Workerman сам обрабатывает рукопожатие по протоколу WebSocket $ws_worker = new Worker('websocket://0.0.0.0:8081'); // Количество рабочих процессов — 4 $ws_worker->count = 4; // Обработка нового подключения // Триггерится при каждом новом соединении $ws_worker->onConnect = function(TcpConnection $connection) { echo "Новое WebSocket-подключение от " . $connection->getRemoteIp() . "\n"; }; // Обработка полученного сообщения от клиента $ws_worker->onMessage = function(TcpConnection $connection, $data) { echo "Получено сообщение: " . $data . "\n"; // Отправка ответа клиенту $connection->send('ServBay Workerman получил: ' . $data); }; // Обработка закрытия соединения $ws_worker->onClose = function(TcpConnection $connection) { echo "WebSocket-соединение закрыто\n"; }; // Обработка ошибок соединения (опционально) $ws_worker->onError = function(TcpConnection $connection, $code, $msg) { echo "Ошибка: $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-клиента.Пример на JavaScript (в консоли браузера):
javascriptvar ws = new WebSocket("ws://localhost:8081"); ws.onopen = function(event) { console.log("WebSocket-соединение установлено"); ws.send("Привет из браузера!"); // отправить сообщение }; ws.onmessage = function(event) { console.log("Сообщение от сервера:", event.data); // выводим полученные данные }; ws.onclose = function(event) { if (event.wasClean) { console.log("WebSocket-соединение завершено, code=" + event.code + " reason=" + event.reason); } else { console.error("WebSocket-соединение аварийно завершено"); } }; ws.onerror = function(error) { console.error("Ошибка WebSocket:", 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После подключения в терминале появится информация о соединении и полученных сообщениях, клиент получит эхо-ответ от сервера.
TCP-сервер на Workerman
Workerman отлично подходит для создания любых TCP-сервисов: игровые backend-сервера, IoT-платформы, пользовательские службы обмена данными.
Код TCP-сервера
Создайте файл
tcp_server.php
и вставьте:php<?php require __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\TcpConnection; // Создать TCP-сервер на порту 8082 // По умолчанию Workerman использует протокол Text (разделитель — \n), можно указать свой $tcp_worker = new Worker('tcp://0.0.0.0:8082'); // Запуск 4 процессов $tcp_worker->count = 4; // Событие нового подключения $tcp_worker->onConnect = function(TcpConnection $connection) { echo "Новое TCP-подключение от " . $connection->getRemoteIp() . "\n"; // Отправить приветствие при подключении $connection->send("Добро пожаловать в ServBay Workerman TCP Server!\n"); }; // Обработка полученных данных $tcp_worker->onMessage = function(TcpConnection $connection, $data) { echo "Получены данные: " . $data; // Эхо-ответ клиенту $connection->send('ServBay Workerman получил: ' . $data); }; // Обработка закрытия соединения $tcp_worker->onClose = function(TcpConnection $connection) { echo "TCP-соединение закрыто\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Запуск TCP-сервера
Запустите сервер:
bashphp tcp_server.php start
1Для работы в фоне добавьте параметр
-d
. Подключаться можно любым TCP-клиентом кlocalhost:8082
.Пример с помощью терминала:
bash# telnet telnet localhost 8082 # или nc (netcat) nc localhost 8082
1
2
3
4
5После подключения выводится приветствие. Введите любой текст и сервер ответит его эхо-отправкой.
Важные нюансы
- Занятость портов: Проверьте, что указанные порты (8080, 8081, 8082) свободны и не используются другими программами ServBay или системой. В случае конфликта Workerman не запустится. Используйте команду
lsof -i :порт
для проверки. - Фаервол: Встроенный фаервол ОС может блокировать внешние подключения к этим портам. Для локальной разработки обычно проблем нет, но для работы из сети настройте правила доступа.
- Workerman и серверы ServBay: Workerman функционирует на собственном порту и является отдельным процессом от Caddy/Nginx в ServBay. Обычно запросы обрабатываются напрямую, а не через прокси (если не настраивать обратное проксирование). Workerman оптимален для задач с постоянными или массовыми асинхронными соединениями (например, WebSocket), серверы Caddy/Nginx — для обычного HTTP.
- Версия PHP: Убедитесь, что используемая версия PHP в ServBay соответствует минимальным требованиям Workerman. В ServBay доступны разные версии — выбирайте подходящую через панель управления.
- Расширения: Для лучшей производительности рекомендуется установить и включить расширения PHP:
event
(ускоряет работу),posix
,pcntl
(для многопроцессорной модели). Большинство расширений уже включены в ServBay, но при возникновении проблем проверьте их активность в настройках. - Логи: В фоновом режиме Workerman пишет логи в файл. Регулярно проверяйте их для мониторинга статуса приложения и поиска ошибок.
FAQ: Часто задаваемые вопросы
- Вопрос: Как остановить сервер Workerman?
- Ответ: Если сервер работает в терминале (foreground), завершите процесс через
Ctrl+C
. Для фонового режима выполните командуphp имя_вашего_скрипта.php stop
в каталоге проекта.
- Ответ: Если сервер работает в терминале (foreground), завершите процесс через
- Вопрос: Почему сервер Workerman не запускается?
- Ответ: Обычно причиной является занятый порт. Ознакомьтесь с ошибкой в терминале и выберите другой порт или освободите занятый. Проверьте процесс командой
lsof -i :порт
.
- Ответ: Обычно причиной является занятый порт. Ознакомьтесь с ошибкой в терминале и выберите другой порт или освободите занятый. Проверьте процесс командой
- Вопрос: Чем отличаются Caddy/Nginx в ServBay и Workerman, какой выбрать?
- Ответ: Серверы Caddy/Nginx — классические веб-серверы для HTTP/HTTPS, работают с PHP-FPM и подходят для обычных сайтов и API. Workerman — асинхронный фреймворк для PHP, выступающий сервером для HTTP, WebSocket, TCP, UDP, работающий как постоянно запущенный процесс с высокой производительностью, идеальный для real-time сервисов, чатов, игр, IoT. Выбор зависит от задачи: для классических сайтов — Caddy/Nginx, для real-time и постоянных соединений — Workerman. Можно также использовать оба в связке (например, как прокси).
- Вопрос: Можно ли одновременно запускать несколько Workerman-приложений в ServBay?
- Ответ: Да, каждое приложение запускается в отдельном процессе и на своём порту. Создайте отдельные скрипты и запускайте для каждого приложение свою команду, главное, чтобы порты не конфликтовали.
Заключение
Из этого руководства вы узнали, как быстро развернуть и запустить проекты Workerman в локальной среде ServBay. Благодаря высокой производительности и асинхронности Workerman, PHP-разработчики могут создавать современный real-time приложения нового поколения. Комбинация “из коробки” среды ServBay с Composer и PHP позволяет сконцентрироваться на бизнес-логике, не тратя время на настройку окружения. Вы сможете создавать HTTP-сервисы, реалтайм WebSocket-приложения и масштабируемые TCP-сервисы легко и удобно, а ServBay станет отличным помощником для разработки на Workerman. Удачи в освоении Workerman!