Развёртывание и запуск приложений Workerman в ServBay
Обзор
Этот документ предназначен для пользователей ServBay и рассказывает, как в локальной среде разработки на macOS, используя интегрированную PHP-среду и Composer, быстро развернуть и запустить высокопроизводительные асинхронные сетевые приложения на базе Workerman. Workerman — мощная библиотека для PHP, идеально подходящая для создания высоконагруженных сетевых сервисов: веб-серверов, серверов для обмена сообщениями в реальном времени, игровых серверов и других решений. ServBay предоставляет полностью готовую для работы платформу, значительно упрощающую настройку рабочей среды для Workerman.
Что такое Workerman?
Workerman — это полностью открытый высокопроизводительный асинхронный сетевой фреймворк, написанный на PHP. Он построен на механизме событийного цикла (EventLoop), реализует асинхронный неблокирующий ввод-вывод и способен обрабатывать огромное число одновременных подключений. В отличие от классической модели web-разработки на PHP (например, Apache/Nginx + PHP-FPM), приложения Workerman запускаются как постоянные процессы в памяти, слушают указанный порт и напрямую обрабатывают сетевые соединения и данные. Это избавляет от затрат на запуск и уничтожение процесса для каждого запроса, что серьёзно повышает производительность и пропускную способность.
С помощью Workerman вы легко сможете реализовать:
- Высокопроизводительный HTTP-сервер, способный обслуживать как статические, так и динамические запросы, и даже заменить Apache/Nginx для несложных задач.
- Серверы WebSocket для чатов, push-уведомлений и любых приложений с передачей данных в реальном времени.
- TCP- и UDP-сервера с поддержкой кастомных протоколов.
- Консольные утилиты, cron-задачи, микросервисы и другие приложения.
Ключевые особенности и преимущества Workerman
- Высокая производительность: Благодаря событиям и асинхронному I/O фреймворк легко справляется с тысячами одновременных соединений, демонстрируя отличные показатели быстродействия.
- Широкая поддержка протоколов: Из коробки реализованы HTTP, WebSocket, TCP, UDP и гибкие интерфейсы для добавления собственных протоколов.
- Простота использования: Удобный, лаконичный API снижает сложность асинхронного программирования, что позволяет PHP-разработчикам быстро освоить Workerman.
- Гибкое масштабирование: Многопроцессная архитектура позволяет эффективно использовать все ядра процессора, а также горизонтально масштабироваться и реализовать балансировку нагрузки. Composer-пакеты и любые сторонние PHP-библиотеки интегрируются без боли.
- Интеграция с экосистемой PHP: Как PHP-библиотека, Workerman легко встраивается в существующую инфраструктуру, а Composer обеспечивает простое управление зависимостями.
- Режим работы демона: Поддерживается работа в режиме демона (background), что удобно для производства и гарантирует стабильную доступность сервиса.
Workerman открывает PHP-разработчикам двери для быстрого создания современных высокопроизводительных сетевых приложений.
Подготовка среды разработки Workerman с помощью ServBay
ServBay — инструмент локальной разработки, созданный для веб-разработчиков. Он комплектуется современными средами выполнения PHP, Node.js, Python, Go, Java, а также такими СУБД и серверным ПО, как Caddy, Nginx, Apache, MySQL, PostgreSQL, MongoDB, Redis, Memcached и пр. Главный плюс ServBay — “из коробки” всё настроено и готово к работе, в том числе Composer. Это особенно упрощает процесс установки и запуска Workerman-проектов.
В этом руководстве мы рассмотрим на простых примерах, как быстро создать и запустить Workerman-приложения в ServBay: HTTP-сервер, WebSocket-сервер и TCP-сервер.
TIP
Для удобства управления и стандартизации рекомендуем хранить все локальные проекты сайтов в папке /Applications/ServBay/www
. Все пути к проектам в этом документе указаны относительно данной директории.
Предварительные требования
Перед началом убедитесь, что выполнены следующие условия:
- Установлен и запущен ServBay: Скачайте и установите актуальную версию с официального сайта ServBay.
- Включён PHP в ServBay: В панели управления убедитесь, что необходимая вам версия PHP активирована. Для Workerman требуется PHP 5.4 или выше, для максимальной производительности рекомендуем PHP 7.x или 8.x.
- Знания PHP и базовые навыки командной строки: Вам понадобится понимание основ синтаксиса PHP и навыки работы в терминале.
Установка Workerman
1. Проверьте доступность Composer
Composer уже предустановлен в ServBay, дополнительная установка не требуется. Убедитесь, что среда ServBay запущена, а нужная версия PHP активна. ServBay автоматически настраивает Composer для выбранной PHP-версии. Для работы с Composer используйте терминал ServBay либо внешний терминал (если PHP и Composer добавлены в PATH).
Проверьте Composer командой:
composer -v
Если Composer установлен и настроен корректно, вы увидите информацию о версии. В противном случае проверьте, работает ли ServBay и активирована ли нужная версия PHP.
2. Создайте директорию проекта
Перейдите в рекомендованную папку и создайте новый проект:
cd /Applications/ServBay/www
mkdir servbay-workerman-demo
cd servbay-workerman-demo
2
3
Здесь мы создаём каталог servbay-workerman-demo
для файлов будущего Workerman-проекта.
3. Установка Workerman с помощью Composer
Внутри папки проекта (/Applications/ServBay/www/servbay-workerman-demo
) выполните установку Workerman:
composer require workerman/workerman
Composer скачает Workerman и все необходимые зависимости в папку vendor
.
Пример кода: HTTP-сервер на Workerman
HTTP-сервера — один из частых сценариев использования Workerman, они подходят для построения быстрых web-приложений и API.
Создайте файл http_server.php
(или любое другое удобное название, например server.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-сервер на всех интерфейсах (0.0.0.0), порт 8080
// 0.0.0.0 — доступен локально и из локальной сети, 8080 — порт
$http_worker = new Worker('http://0.0.0.0:8080');
// Задаём количество воркеров (процессов)
// Здесь 4 — будет запущено 4 независимых процесса, можно увеличить в зависимости от числа ядер процессора
$http_worker->count = 4;
// Описываем логику обработки входящих HTTP-запросов
// $connection — текущий объект соединения, через него отправляется ответ клиенту
// $request — объект запроса с деталями (URL, заголовки, тело и т.д.)
$http_worker->onMessage = function(TcpConnection $connection, Request $request) {
// Отправка простого ответа клиенту
// HTTP-заголовки формируются автоматически
$connection->send(new Response(200, [], 'Hello ServBay Workerman HTTP Server!'));
};
// Запуск всех воркеров
// Основной event loop Workerman, после запуска процессы начинают слушать порт и обрабатывать события
Worker::runAll();
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 (Worker
,Request
,Response
и др.).use Workerman\...;
: Импортирует используемые классы.new Worker('http://0.0.0.0:8080')
: Создаёт экземпляр Workerman с указанием протокола и адреса (http
,0.0.0.0:8080
).$http_worker->count = 4;
: Количество процессов. Можно увеличить/уменьшить для масштабирования.$http_worker->onMessage = function(TcpConnection $connection, Request $request) { ... };
: Callback, который Workerman вызывает при получении полного HTTP-запроса.$connection
используется для отправки ответа,$request
содержит детали входящего запроса. КлассResponse
формирует стандартный HTTP-ответ.Worker::runAll();
: Запускает событийный цикл Workerman и начинает обработку соединений.
Запуск HTTP-сервера Workerman
В каталоге проекта (/Applications/ServBay/www/servbay-workerman-demo
) выполните команду для запуска HTTP-сервера:
php http_server.php start
Режимы работы:
- Форграунд (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 позволяет создать постоянное, двустороннее соединение между клиентом и сервером — идеально для реализации чатов, онлайн-графиков, игр и других real-time-приложений. 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-сервер, handshake обрабатывается автоматически $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"; }; // Логика при получении сообщения от клиента // $data — полученное сообщение (уже декодировано) $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::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 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В терминале появится информация о соединении, при отправке сообщений вы увидите эхо-ответы сервера.
Создание 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 "Новое TCP-соединение от " . $connection->getRemoteIp() . "\n"; // Отправляем приветственное сообщение при соединении $connection->send("Добро пожаловать в ServBay Workerman TCP Server!\n"); }; // Логика при получении TCP-сообщения // $data — сырые данные от клиента после (декодирования по протоколу) $tcp_worker->onMessage = function(TcpConnection $connection, $data) { echo "Получены данные: " . $data; // Эхо-ответ клиенту $connection->send('ServBay Workerman получил: ' . $data); }; // Логика при разрыве соединения $tcp_worker->onClose = function(TcpConnection $connection) { echo "TCP-соединение закрыто\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 можно открыть новую вкладку терминала и использовать
telnet
либоnc
(netcat):bash# Через telnet telnet localhost 8082 # Или через nc (netcat) nc localhost 8082
1
2
3
4
5После соединения вы увидите приветственное сообщение от сервера. Наберите любой текст и нажмите Enter — сервер вернёт эхо-ответ.
Важные замечания
- Занятость портов: Удостоверьтесь, что выбранные порты (в примерах — 8080, 8081, 8082) не заняты системой macOS или другими сервисами в ServBay. При конфликте портов сервер не стартует и выдаёт ошибку. Проверяйте занятость командой
lsof -i :номер_порта
. - Брандмауэр: Встроенный firewall macOS может заблокировать входящие соединения извне. Обычно это не влияет на локальную разработку, но если нужно подключаться из локальной сети, настройте firewall соответствующим образом.
- Взаимодействие с веб-серверами ServBay: Workerman работает на своих портах и полностью независим от интегрированных далее Caddy или Nginx. Приложения Workerman обычно напрямую обрабатывают соединения, проксирование через Caddy/Nginx требуется только при явной необходимости (например, для reverse proxy). Workerman особенно хорош для долгоживущих соединений (WebSocket), в то время как Caddy/Nginx в ServBay оптимальны для классических коротких HTTP-запросов.
- Версия PHP: Пользуйтесь поддерживаемой версией PHP согласно требованиям Workerman. Рабочая среда ServBay предлагает несколько версий PHP, выбрать подходящую можно в панели управления.
- Необходимые расширения: Для максимальной производительности Workerman использует некоторые PHP-расширения, например,
event
(повышает производительность, если активирован),posix
,pcntl
(для мультипроцессных приложений). Большинство популярных расширений включены по умолчанию, однако при возникновении ошибок проверьте список активных расширений той версии PHP, которой вы пользуетесь. - Логи: В режиме демона вывод сервера уходит в лог-файл. Регулярно отслеживайте логи для контроля состояния приложений и поиска ошибок.
Часто задаваемые вопросы (FAQ)
- В: Как остановить сервер Workerman?
- О: Если сервер работает на переднем плане (через
start
), нажмитеCtrl+C
в терминале. Если запущен в фоне (черезstart -d
), используйте командуphp имя_файла_сервера.php stop
из папки проекта.
- О: Если сервер работает на переднем плане (через
- В: Почему не запускается сервер Workerman?
- О: Самая частая причина — порт уже занят. Внимательно читайте сообщения об ошибках в терминале. Попробуйте использовать другой свободный порт или остановить занявший его процесс (используйте
lsof -i :номер_порта
).
- О: Самая частая причина — порт уже занят. Внимательно читайте сообщения об ошибках в терминале. Попробуйте использовать другой свободный порт или остановить занявший его процесс (используйте
- В: Чем отличается Caddy/Nginx в ServBay от Workerman? Какой вариант выбрать?
- О: Встроенные Caddy/Nginx — это классические веб-серверы, работающие с короткими HTTP/HTTPS-запросами совместно с PHP-FPM, где PHP-процесс запускается на каждый запрос и завершается после его выполнения. Workerman — асинхронный PHP-фреймворк, сам по себе выступающий сервером; он поддерживает HTTP, WebSocket, TCP и другие протоколы, работает как постоянный процесс, и создаёт высокопроизводительные сервисы для real-time-заданий. Классический сайт или RESTful API лучше обслуживать через Caddy/Nginx; онлайн-чаты, push-сервисы, игры — через Workerman. Можно совмещать оба подхода: Caddy/Nginx — как прокси для определённых запросов, направляемых на Workerman.
- В: Можно ли запускать несколько приложений Workerman одновременно в ServBay?
- О: Да. Каждое приложение Workerman запускается отдельным процессом PHP и слушает свой порт. Для каждого создайте отдельный скрипт и запускайте их в отдельных терминальных окнах (либо в фоне). Не допускайте конфликта портов.
Итоги
Следуя данному руководству, вы научились быстро развертывать и запускать проекты Workerman в современной и удобной локальной среде ServBay. Высокая производительность и асинхронность Workerman открывают широкие возможности PHP-разработчикам для построения современных сетевых решений. Используйте преднастроенный Composer и знакомую среду PHP в ServBay — и вы сможете сосредоточиться на бизнес-логике Workerman-приложений, не тратя время на сложную настройку окружения. Хотите строить быстрые веб-сервисы или приложения с прямым обменом данными в реальном времени — ServBay станет вам отличным помощником при работе с Workerman. Удачи в освоении Workerman и интересных вам проектов!