Использование Swoole для создания высокопроизводительных PHP-приложений в ServBay
ServBay — это локальная среда веб-разработки, созданная специально для разработчиков. Она включает предустановленные среды, базы данных и инструменты для различных языков, упрощая процессы локальной разработки. В этой статье мы рассмотрим, как использовать расширение Swoole внутри ServBay для усиления PHP-приложений и построения высокопроизводительных сетевых сервисов.
Что такое Swoole?
Swoole — это параллельный высокопроизводительный сетевой движок для PHP, построенный на корутинах. Написанный на C, он обеспечивает асинхронное, параллельное и корутинное взаимодействие для PHP. Благодаря Swoole, разработчики могут преодолеть ограничения классической модели запрос-ответ (например, Apache/Nginx + PHP-FPM) и эффективнее работать с высоконагруженными задачами, такими как постоянные веб-серверы, асинхронные обработчики задач или сервисы реального времени (WebSocket).
Ключевые особенности Swoole:
- Высокая производительность: ядро на языке C с поддержкой асинхронного ввода-вывода, мультипроцессов и многопоточности.
- Корутины: легковесные корутины позволяют писать асинхронный код в синхронном стиле, упрощая логику приложений.
- Широкая поддержка протоколов: из коробки реализованы TCP, UDP, HTTP, WebSocket.
- Простота: лаконичный API, привычный для PHP-разработчиков.
- Постоянное выполнение: приложения работают постоянно как отдельный процесс, без затрат на инициализацию при каждом запросе.
Swoole делает PHP не только языком для веб-разработки, но и мощным инструментом для более сложных и высоконагруженных сетевых задач.
Включение Swoole в ServBay
Одна из целей ServBay — упростить установку и управление расширениями PHP. Ключевое расширение для современной высокопроизводительной разработки — Swoole — уже включено в дистрибутив ServBay, и его активация элементарна.
Требования:
- Установленный и запущенный ServBay.
- Как минимум одна установленная версия PHP внутри ServBay.
Шаги для включения:
- Откройте интерфейс приложения ServBay.
- Перейдите в раздел “Пакеты (Packages)” или менеджер версий PHP. (Название может отличаться в зависимости от версии ServBay, обычно это видно в главном окне или настройках)
- Выберите нужную версию PHP, для которой хотите включить Swoole.
- Найдите пункт с расширением Swoole и включите его. В ServBay список доступных расширений отображается как перечень или в виде переключателей.
- Сохраните изменения и перезапустите ServBay или выбранный PHP-сервис, если потребуется. ServBay автоматически применит нужные настройки для загрузки расширения Swoole.
После этого Swoole будет доступен для использования в выбранной версии PHP. Для проверки наберите в терминале php -m
— в списке загруженных расширений должно быть указано swoole
.
TIP
По умолчанию рекомендуется размещать сайты и проекты в каталоге /Applications/ServBay/www
— так упрощается управление сайтами и настройка через ServBay. В примерах далее будем использовать этот путь.
Пример: простой HTTP-сервер на Swoole
Далее создадим базовый HTTP-сервер на Swoole для обработки веб-запросов.
Шаг 1: Создайте папку проекта
Откройте терминал и выполните (по рекомендациям ServBay):
bash
cd /Applications/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;
// Создание экземпляра HTTP-сервера Swoole
// Прослушивание всех сетевых интерфейсов (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: Запуск HTTP-сервера на Swoole
Убедитесь, что вы находитесь в папке servbay-swoole-http
, и используйте версию PHP с активированным Swoole для запуска:
bash
php server.php
1
При успешном запуске в терминале появится:
bash
Swoole HTTP server is started at http://0.0.0.0:9501
1
Это значит, что сервер запущен и слушает порт 9501.
Шаг 4: Доступ к серверу Swoole
Откройте браузер и перейдите по адресам:
http://localhost:9501
http://localhost:9501/info
В первом случае на странице будет выведено Hello ServBay!
, во втором — текст с информацией о запросе.
Для остановки сервера нажмите в окне терминала, где он работает, Ctrl + C
.
Работа с WebSocket через Swoole
Swoole поддерживает протокол WebSocket на низком уровне, что позволяет легко создавать приложения реального времени — чаты, игровые серверы, сервисы push-уведомлений и пр.
Шаг 1: Скрипт WebSocket-сервера
В папке /Applications/ServBay/www/servbay-swoole-http
(или отдельной, например, servbay-swoole-websocket
) создайте файл websocket_server.php
со следующим содержимым:
php
<?php
use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
// Создание экземпляра WebSocket-сервера Swoole
// 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 содержит данные сообщения, $frame->fd — идентификатор клиента
$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
49
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
49
Этот скрипт разворачивает WebSocket-сервер Swoole на порту 9502. Заданы коллбеки для ключевых событий: start
(запуск), open
(новое соединение), message
(получено сообщение), close
(разрыв соединения). В обработчике сообщений сервер отправляет назад клиенту его же сообщение с префиксом.
Шаг 2: Запуск WebSocket-сервера
Перейдите в папку, где лежит websocket_server.php
, и запустите его через PHP с активным Swoole:
bash
php websocket_server.php
1
В случае успеха увидите в терминале:
bash
Swoole WebSocket server is started at ws://0.0.0.0:9502
1
Теперь сервер работает в фоне и ждет WebSocket-соединений на порту 9502.
Шаг 3: Тестовое соединение с WebSocket-сервером
Существует несколько способов подключиться к серверу для проверки его работы.
Вариант A: через инструменты разработчика в браузере
В современных браузерах (обычно через F12) есть панель “Сеть (Network)” или “Консоль (Console)” для тестирования WebSocket.
Откройте любую страницу (например,
about:blank
).Откройте инструменты разработчика и выберите вкладку “Консоль”.
Введите следующий JavaScript-код, чтобы установить соединение:
javascriptvar 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("ваше сообщение") // Закрыть соединение — ws.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21Запустите код в консоли и отслеживайте результат, а также сообщения в терминале с запущенным
websocket_server.php
.
Вариант B: использование команды wscat
wscat
— удобный WebSocket-клиент для командной строки на Node.js.
Установка
wscat
: Если у вас не установлен Node.js и npm — установите их. Затем выполните установкуwscat
глобально:bashnpm install -g wscat
1Подключение к серверу: Введите в терминале:
bashwscat -c ws://localhost:9502
1После подключения появится приглашение вида
>
.Отправка сообщений: Просто наберите текст и нажмите Enter:
bash> Hello ServBay via wscat
1Ответ от сервера появится тут же (строка будет начинаться с
<
):bash< Hello, you sent: Hello ServBay via wscat
1Также в терминале с работающим сервером отобразится лог сообщения.
Для завершения соединения с wscat
нажмите Ctrl + C
.
Важные моменты
- Конфликт портов: Проверьте, что порты (например, 9501, 9502), которые использует Swoole-сервер, свободны и не заняты другими приложениями в системе.
- Версия PHP: Для запуска скриптов убедитесь, что используете именно ту версию PHP, в которой активно расширение Swoole. Уточнить текущую версию можно через
php -v
. В ServBay есть удобный инструмент для переключения версий PHP. - Статус расширения: Если сервер не стартует — перепроверьте, что расширение Swoole включено именно для выбранной версии PHP, и что в ServBay или PHP-сервисе применены изменения (перезапуск).
- Управление процессом: Серверы на Swoole — это постоянные процессы в памяти. В production рекомендуется использовать инструменты управления процессами (Supervisor, Systemd, pm2 и пр.) для автостарта и защиты от падений. В локальной среде ServBay зачастую достаточно ручного запуска из терминала.
Итоги
С помощью ServBay вы можете легко подключить и использовать расширение Swoole для разработки и тестирования высокопроизводительных PHP-приложений: как классических HTTP-сервисов, так и современных WebSocket-сервисов в реальном времени. Мощь Swoole в сочетании с удобством и гибкостью среды ServBay открывает PHP-разработчикам новые горизонты для масштабируемых и эффективных решений. Попробуйте Swoole в ServBay прямо сейчас!