Использование Swoole для создания высокопроизводительных PHP приложений
Что такое Swoole?
Swoole — это высокопроизводительный сетевой фреймворк для PHP, который предоставляет возможности асинхронного, многопоточного и корутинного выполнения, позволяя PHP обрабатывать задачи с высокой конкурентностью, подобно Node.js. Он поддерживает множество протоколов, включая TCP, UDP, UnixSocket, HTTP, WebSocket и т.д., и подходит для создания высокопроизводительных веб-серверов, микросервисных архитектур, систем реального времени и т.п.
Основные особенности и преимущества Swoole
- Высокая производительность: Swoole написан на языке C, обладает высокой производительностью, поддерживает асинхронный ввод/вывод и корутины, что позволяет обрабатывать высококонкурентные запросы.
- Богатый функционал: Поддержка множества сетевых протоколов, таймеров, управления процессами, управления памятью и других функций для удовлетворения различных потребностей разработки.
- Легкость в использовании: Простой и удобный API, а также богатая документация помогают разработчикам быстро начать работу.
- Высокая расширяемость: Поддержка кастомных расширений и плагинов, позволяющих гибко настраивать под потребности.
Swoole — это идеальный выбор для создания высокопроизводительных веб-приложений и систем реального времени, подходит для проектов от небольших приложений до крупных корпоративных систем.
Установка Swoole
В этой статье мы расскажем, как установить и использовать Swoole в среде ServBay.
TIP
ServBay рекомендует разработчикам размещать сайты в директории /Applications/ServBay/www
для удобства управления.
Шаг 1: Установка расширения Swoole
Активируйте расширение Swoole
ServBay уже встраивает расширение Swoole, пользователю необходимо сначала активировать его и перезапустить PHP. Пожалуйста, обратитесь к статье Как активировать модуль Swoole в ServBay для активации модуля Swoole.
Шаг 2: Создание директории проекта
Создайте директорию проекта и перейдите в неё:
cd /Applications/ServBay/www
mkdir servbay-swoole-app
cd servbay-swoole-app
2
3
Шаг 3: Создание скрипта Swoole сервера
Создайте файл server.php
в директории проекта, напишите простой HTTP сервер на Swoole:
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
$server = new Server("0.0.0.0", 9501);
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
});
$server->on("request", function (Request $request, Response $response) {
$response->header("Content-Type", "text/plain");
$response->end("Hello ServBay!");
});
$server->start();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Шаг 4: Запуск Swoole сервера
Запустите Swoole сервер, выполнив следующую команду в терминале:
php server.php
Вы увидите следующий вывод:
Swoole HTTP server is started at http://0.0.0.0:9501
Шаг 5: Доступ к Swoole серверу
Откройте браузер и перейдите по адресу http://localhost:9501
, вы увидите на странице Hello ServBay!
.
Создание веб-приложения с использованием Swoole
В этом разделе мы расскажем, как создать простое веб-приложение с использованием Swoole.
Создание контроллеров и маршрутов
Создайте директорию app
в проекте и внутри неё директории controllers
и routes
:
mkdir -p app/controllers
mkdir -p app/routes
2
Создайте файл HomeController.php
в директории app/controllers
:
<?php
namespace App\Controllers;
class HomeController
{
public function index()
{
return "Welcome to ServBay!";
}
public function hello($name)
{
return "Hello, $name!";
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Создайте файл web.php
в директории app/routes
:
<?php
use App\Controllers\HomeController;
return [
'GET /' => [HomeController::class, 'index'],
'GET /hello/{name}' => [HomeController::class, 'hello'],
];
2
3
4
5
6
7
8
Обновление скрипта Swoole сервера
Обновите файл server.php
, добавив логику обработки маршрутов и вызова контроллеров:
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
use FastRoute\RouteCollector;
use function FastRoute\simpleDispatcher;
require 'vendor/autoload.php';
$server = new Server("0.0.0.0", 9501);
$routes = require __DIR__ . '/app/routes/web.php';
$dispatcher = simpleDispatcher(function (RouteCollector $r) use ($routes) {
foreach ($routes as $route => $handler) {
list($method, $path) = explode(' ', $route);
$r->addRoute($method, $path, $handler);
}
});
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
});
$server->on("request", function (Request $request, Response $response) use ($dispatcher) {
$routeInfo = $dispatcher->dispatch($request->server['request_method'], $request->server['request_uri']);
switch ($routeInfo[0]) {
case \FastRoute\Dispatcher::NOT_FOUND:
$response->status(404);
$response->end('404 Not Found');
break;
case \FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
$response->status(405);
$response->end('405 Method Not Allowed');
break;
case \FastRoute\Dispatcher::FOUND:
$handler = $routeInfo[1];
$vars = $routeInfo[2];
list($class, $method) = $handler;
$response->header("Content-Type", "text/plain");
$response->end(call_user_func_array([new $class, $method], $vars));
break;
}
});
$server->start();
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
Установка FastRoute
Выполните следующую команду в корневой директории проекта для установки библиотеки маршрутизации FastRoute:
composer require nikic/fast-route
Запуск Swoole сервера
Запустите Swoole сервер, выполнив следующую команду в терминале:
php server.php
Доступ к веб-приложению
Откройте браузер и перейдите по следующим URL:
http://localhost:9501/
: Вы увидите на страницеWelcome to ServBay!
.http://localhost:9501/hello/ServBay
: Вы увидите на страницеHello, ServBay!
.
Обработка WebSocket соединений с использованием Swoole
Swoole также поддерживает протокол WebSocket, что позволяет создавать приложения для реального времени. Мы расскажем, как обработать WebSocket соединения с использованием Swoole.
Создание скрипта WebSocket сервера
Создайте файл websocket_server.php
в директории проекта, напишите простой WebSocket сервер:
<?php
use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
$server = new Server("0.0.0.0", 9502);
$server->on("start", function (Server $server) {
echo "Swoole WebSocket server is started at ws://0.0.0.0:9502\n";
});
$server->on("open", function (Server $server, Request $request) {
echo "connection open: {$request->fd}\n";
});
$server->on("message", function (Server $server, Frame $frame) {
echo "received message: {$frame->data}\n";
$server->push($frame->fd, "Hello, {$frame->data}");
});
$server->on("close", function ($ser, $fd) {
echo "connection close: {$fd}\n";
});
$server->start();
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
Запуск WebSocket сервера
Запустите WebSocket сервер, выполнив следующую команду в терминале:
php websocket_server.php
Вы увидите следующий вывод:
Swoole WebSocket server is started at ws://0.0.0.0:9502
Подключение к WebSocket серверу
Вы можете подключиться к WebSocket серверу, используя WebSocket клиент в браузере или другой инструмент (например, wscat
).
Подключение с использованием wscat
Установите
wscat
:bashnpm install -g wscat
1Подключитесь к WebSocket серверу:
bashwscat -c ws://localhost:9502
1Отправьте сообщение:
bash> Hello ServBay
1
Вы увидите ответ от сервера:
< Hello, Hello ServBay
Следуя этим шагам, вы успешно создали и запустили проект на основе Swoole, используя функции Swoole для обработки HTTP запросов и WebSocket соединений. Высокая производительность и богатый функционал Swoole делают его идеальным выбором для создания высококонкурентных приложений.