Использование Swoole в ServBay для создания высокопроизводительных PHP-приложений
ServBay — это локальная веб-среда разработки, созданная специально для разработчиков. Она поставляется с предустановленными языковыми окружениями, базами данных и инструментами, упрощая работу над проектами. В этой статье вы узнаете, как с помощью расширения Swoole в ServBay создавать быстрые и эффективные сетевые сервисы для PHP.
Что такое Swoole?
Swoole — это высокопроизводительный сетевой движок на корутинах (Coroutine), разработанный для PHP. Он написан на чистом C и расширяет возможности PHP для параллельных и асинхронных сетевых коммуникаций. Благодаря Swoole разработчики PHP могут выйти за пределы традиционной схемы «Apache/Nginx + PHP-FPM» и реализовывать такие задачи, как постоянные серверы, асинхронная обработка задач, онлайн-сервисы реального времени (например, WebSocket).
Ключевые особенности Swoole:
- Высокая производительность: Реализован на уровне C, поддерживает асинхронный I/O, многопроцессорность и многопоточность.
- Корутины: Легковесные корутины позволяют писать асинхронный код в синхронном стиле, облегчая разработку.
- Поддержка разных протоколов: Встроенная поддержка TCP, UDP, HTTP, WebSocket и других сетевых протоколов.
- Удобство использования: Элегантный и привычный для PHP API.
- Постоянные процессы: Приложения могут работать как сервисы в памяти, без повторного запуска и инициализации на каждый запрос.
С помощью Swoole PHP превращается из языка только для веб-разработки в инструмент для гораздо более широких и производительных сетевых решений.
Активация Swoole в ServBay
Одна из задач ServBay — упростить управление PHP-расширениями. Swoole уже включён в дистрибутив ServBay, и его активация занимает всего несколько минут.
Что потребуется:
- ServBay установлен и запущен.
- В ServBay установлен хотя бы один PHP.
Шаги активации:
- Откройте интерфейс ServBay.
- Перейдите в раздел «Пакеты» (Packages) или управления версиями PHP. (В зависимости от версии ServBay названия могут отличаться, обычно нужный раздел — на главной или в настройках.)
- Выберите ту версию PHP, для которой хотите активировать Swoole.
- Найдите пункт Swoole и включите его. ServBay показывает список доступных расширений — активируйте Swoole галочкой или переключателем.
- Сохраните изменения и перезапустите ServBay или PHP-сервис, если это потребуется. ServBay автоматически настроит все параметры для загрузки Swoole.
После этих шагов Swoole станет доступен в выбранной версии PHP. Для проверки — выполните команду php -m
и найдите строку swoole
в списке расширений.
TIP
Рекомендуем хранить сайты и проектные файлы в следующих директориях для правильной работы с ServBay:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
В примерах данной статьи используются именно эти каталоги.
Создание простого HTTP-сервера на Swoole
Покажем, как запустить базовый HTTP-сервер на Swoole и обрабатывать веб-запросы.
Шаг 1: Создайте каталог проекта
Откройте терминал и создайте/перейдите в новую папку под проект — согласно рекомендациям ServBay:
macOS:
bash
cd /Applications/ServBay/www
mkdir servbay-swoole-http
cd servbay-swoole-http
1
2
3
2
3
Windows:
cmd
cd C:\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) {
// Установить заголовки ответа
$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: Проверьте работу сервера
В браузере откройте:
http://localhost:9501
http://localhost:9501/info
Вы получите «Hello ServBay!» или текст с деталями запроса.
Остановить сервер можно сочетанием клавиш Ctrl + C
в том же терминале.
Обработка WebSocket-соединений с Swoole
Swoole поддерживает WebSocket «из коробки», что подходит для чатов, игровых серверов и систем мгновенных уведомлений.
Шаг 1: Напишите скрипт WebSocket-сервера
В каталоге проекта (например, servbay-swoole-http
, либо в новом servbay-swoole-websocket
) создайте файл websocket_server.php
с содержимым:
Путь к проекту:
- macOS:
/Applications/ServBay/www/servbay-swoole-http
- Windows:
C:\ServBay\www\servbay-swoole-http
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 содержит данные сообщения и дескриптор отправителя
$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
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
Этот код поднимает WebSocket-сервер на порте 9502 с простыми обработчиками событий: запуск, новое соединение, получение сообщения, закрытие соединения. Сообщения, полученные от клиента, с префиксом отправляются обратно.
Шаг 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
Теперь сервер готов принимать WebSocket-соединения.
Шаг 3: Тестирование WebSocket-сервера
Есть несколько способов подключиться и протестировать сервер.
Способ A: Через инструменты разработчика браузера
В современных браузерах откройте (F12) консоль и выполните JavaScript-код для подключения:
javascript
var 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("text")
// Отключайтесь через ws.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
В консоли и терминале сервера появятся соответствующие логи.
Способ B: Через утилиту командной строки wscat
wscat
— популярный WebSocket-клиент для командной строки на базе Node.js.
- Установите
wscat
: Если Node.js и npm не установлены — поставьте их. Затем:bashnpm install -g wscat
1 - Подключитесь к серверу:bashПосле подключения появится приглашение
wscat -c ws://localhost:9502
1>
. - Общайтесь с сервером:bashОтвет сервера:
> Hello ServBay via wscat
1bashВ терминале сервера отображаются соответствующие сообщения.< Hello, you sent: Hello ServBay via wscat
1
Для выхода из wscat — используйте Ctrl + C
.
Важные рекомендации
- Конфликт портов: Убедитесь, что выбранные порты (9501, 9502 и др.) свободны и не используются другим ПО, иначе сервер не запустится.
- Версия PHP: Для запуска используйте только PHP из ServBay с активированным Swoole. Проверить версию можно через
php -v
. В ServBay предусмотрен удобный способ выбора версии PHP. - Статус расширения: Если сервер не стартует — проверьте, включён ли Swoole для вашей версии PHP, и перезапустите ServBay или нужный сервис.
- Управление процессом: Сервер Swoole работает как постоянный процесс. В продакшне рекомендуется использовать средства управления сервисами (Supervisor, Systemd, pm2 и пр.) для авто-перезапуска. В локальной среде ServBay достаточно запустить процесс вручную.
Итог
С помощью ServBay легко активировать и использовать Swoole — современное расширение для PHP, позволяющее создавать и тестировать высокопроизводительные приложения в локальной среде, будь то HTTP-сервисы или WebSocket-решения. Мощь Swoole и удобство ServBay открывают новые горизонты для PHP-разработчиков, помогая делать проекты быстрее и технологичнее. Попробуйте Swoole прямо сейчас в ServBay!