Спонсор
Необходимо убедиться, что операционная среда соответствует следующим требованиям:
composer create-project api-swoole/skeleton
Поддерживает службу HTTP, службу WebSocket, службу TCP и выполняет команды в корневом каталоге проекта ./apiswoole.php
.
php apiswoole.php
В рамках API-Swoole основной бизнес-код находится в каталоге приложения. Каждое пространство имен внутри соответствует подкаталогу. Пространство имен проекта по умолчанию — App. После создания проекта каталог приложения содержит три подкаталога: Common, Пример и Ext. В каталоге Common хранится файл функции.php. а Ext вообще размещает инструменты и т.д. Структура каталогов следующая:
./
└── app
├── Example # 放置接口源代码,相当于控制器层
├── Common # 公共代码目录,
└── Ext# 放置工具等
Если в проект необходимо добавить новый интерфейс, сначала создайте новый файл hello.php
в каталоге ./app/Example
и отредактируйте код в редакторе.
<?php
namespace AppExample;
use SapiApi;
class Hello extends Api
{
public function index()
{
return [
'code' => 200,
'data' => [
'name' => 'api-swoole',
'version' => DI()->config->get('conf.version'),
],
];
}
}
Определите маршрут проекта в файле маршрутизации route/http.php
. Первый параметр — это определенный адрес доступа браузера. Первая половина второго параметра @
— это полное пространство имен файла. Вторая половина — это конкретное имя @
в методе класса.
return [
HttpRouter("/hello", "AppExampleHello@index"),
];
Выполните следующую команду в корневом каталоге проекта, чтобы запустить его в режиме без демона.
php apiswoole.php
По умолчанию он прослушивает локальный HTTP и порт веб-сокета 9501. В cmd отображается следующая выходная информация, указывающая на успешный запуск проекта.
[Success] Swoole: 4.5.9, PHP: 7.4.13, Port: 9501
[Success] Swoole Http Server running:http://0.0.0.0:9501
[Success] Swoole websocket Server running:ws://0.0.0.0:9501
[Success] Swoole tcp Server running:0.0.0.0:9500
[Success] Swoole udp Server running:0.0.0.0:9502
Введите определенный адрес маршрутизации в адресную строку браузера. Этот адрес состоит из http://ip网址:端口/定义的路由
.
http://127.0.0.1:9501/hello
Данные, возвращаемые после успешного запроса, по умолчанию возвращаются в формате json, включая поля кода по умолчанию, сообщения и данных. Данные в data — это данные, возвращаемые в методе.
{
"code" : 200 ,
"msg" : " success " ,
"data" : {
"code" : 200 ,
"data" : {
"name" : " api-swoole " ,
"version" : " 1.0.2 "
}
},
"debug" : []
}
Поскольку поддержка HTTP
-протокола HttpServer
неполная, рекомендуется использовать его только в качестве сервера приложений для обработки динамических запросов и добавлять Nginx
в качестве прокси-сервера во внешнем интерфейсе. (справочный адрес)
server {
listen 80;
server_name swoole.test;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:9501;
}
}
Вы можете получить реальный IP
клиента, прочитав $request->header['x-real-ip']
Папка конфигурации по умолчанию содержит три файла: conf.php, db.php и event.php. conf.php содержит информацию о конфигурации проекта, включая http, tcp, udp, websocket и другие конфигурации. db.php отвечает за настройку соединений MySQL и Redis, а event.php отвечает за определение и настройку регистрации и мониторинга определенных событий. Теперь он поддерживает регистрацию событий workerStart、open、close、task、finish
. Информацию о конфигурации можно прочитать через DI()->config->get('conf.ws')
или SapiDi::one()->config->get('conf.ws')
.
./config/
├── conf.php #http、tcp、udp、websocket等配置
├── db.php #数据库配置
└── events.php #定制特定事件注册监听
<?php
return [
'version' => '1.0.2',
'debug' => true,//调试模式
'log' => [
'displayConsole' => true,//true控制台打印日志
'saveLog' => true,//保存日志
],
'udp' => [
'host' => '0.0.0.0',
'port' => 9502,
'sockType' => SWOOLE_SOCK_UDP,
'events' => [
['packet', AppExampleUdpServe::class, 'onPacket'],
],
'settings' => [],
],
'tcp' => [
'host' => '0.0.0.0',
'port' => 9501,
'sockType' => SWOOLE_SOCK_TCP,
'events' => [
['Receive', AppExampleTcpServe::class, 'onReceive'],
['connect', AppExampleTcpServe::class, 'onConnect'],
['close', AppExampleTcpServe::class, 'onClose'],
],
'settings' => [],
],
'ws' => [
'host' => '0.0.0.0',
'port' => 9500,
'events' => [
['open', SapiEvents::class, 'onOpen'],
['message', SapiEvents::class, 'onMessage'],
['close', SapiEvents::class, 'onClose'],
['request', SapiEvents::class, 'onRequest'],
['Task', SapiEvents::class, 'onTask'],
['Finish', SapiEvents::class, 'onFinish'],
['workerStart', SapiEvents::class, 'onWorkerStart'],
['start', SapiEvents::class, 'onStart'],
],
'settings' => [
'daemonize' => false,//设置 daemonize => true 时,程序将转入后台作为守护进程运行。长时间运行的服务器端程序必须启用此项。如果不启用守护进程,当 ssh 终端退出后,程序将被终止运行
// 'dispatch_mode' => 2,//数据包分发策略。【默认值:2】
'worker_num' => swoole_cpu_num(),
'log_file' => 'storage/swoole',
'log_rotation' => SWOOLE_LOG_ROTATION_DAILY,
'log_date_format' => '%Y-%m-%d %H:%M:%S',
'log_level' => SWOOLE_LOG_DEBUG,
'task_worker_num' => 10,
'enable_coroutine' => true,//是否启用异步风格服务器的协程支持
// 'buffer_output_size' => 32 * 1024 * 1024, //配置发送输出缓存区内存尺寸。【默认值:2M】
// 'document_root' => ROOT_PATH,
// 'enable_static_handler' => true,//开启静态文件请求处理功能
// 'static_handler_locations' => ['/chatroom', '/app/images'],//设置静态处理器的路径。类型为数组,默认不启用。
],
// SWOOLE_LOG_DEBUG 调试日志,仅作为内核开发调试使用
// SWOOLE_LOG_TRACE 跟踪日志,可用于跟踪系统问题,调试日志是经过精心设置的,会携带关键性信息
// SWOOLE_LOG_INFO 普通信息,仅作为信息展示
// SWOOLE_LOG_NOTICE 提示信息,系统可能存在某些行为,如重启、关闭
// SWOOLE_LOG_WARNING 警告信息,系统可能存在某些问题
// SWOOLE_LOG_ERROR 错误信息,系统发生了某些关键性的错误,需要即时解决
// SWOOLE_LOG_NONE 相当于关闭日志信息,日志信息不会抛出
],
'process' => [
[AppExampleProcess::class, 'addProcess']
],//添加用户自定义的工作进程
];
Служба по умолчанию регистрируется в apiswoole.php
при запуске проекта.
$di = DI();
$di->config = new Config("./config");
Например, информация о конфигурации — conf.php, а структура:
return [
'debug' => true,//调试模式
'tcp' => [
'host' => '0.0.0.0',
'port' => 9500,
'sockType' => SWOOLE_SOCK_TCP,
'events' => [
['receive', AppControllerTcpServe::class, 'onReceive'],
],
'settings' => [],
],
]
Вы можете использовать DI()->config->get('conf.tcp')
для чтения файла конфигурации.
DI()->config->get('conf.tcp') #返回数组
Возвращает структуру данных массива:
{
"host" : " 0.0.0.0 " ,
"port" : 9500 ,
"sockType" : 1 ,
"events" : [
[
" receive " ,
" App \ Controller \ TcpServe " ,
" onReceive "
]
],
"settings" : []
}
Интерфейс журнала подробно определен в соответствии со спецификацией PSR. Журналы записываются в каталог ./storage/log
, а日期.log
создаются ежедневно. На данный момент поддерживаются следующие типы журналирования:
Система регистрации использует:
DI()->logger->debug("日志测试debug"); #开发调试类日记
DI()->logger->info("日志测试info"); #业务纪录类日记
DI()->logger->notice("日志测试notice");#系统提示类日记
DI()->logger->waring("日志测试waring");#系统致命类日记
DI()->logger->error("日志测试error"); #系统异常类日记
Соответствующий журнал в каталоге ./storage/log/20220906.log
:
[swoole] | [2022-09-06 01:32:05] | debug | 日志测试debug
[swoole] | [2022-09-06 01:32:05] | info | 日志测试info
[swoole] | [2022-09-06 01:32:05] | notice | 日志测试notice
[swoole] | [2022-09-06 01:32:05] | warning | 日志测试waring
[swoole] | [2022-09-06 01:32:05] | error | 日志测试error
WebSocketServer
наследует от HttpServer, поэтому можно использовать все API
и элементы конфигурации, предоставляемые HttpServer
. Пожалуйста, обратитесь к главе HttpServer.
WebSocketServer
также может одновременно служить HTTP
сервером.WebSocketServer
вернет страницу с ошибкой HTTP 400
после получения HTTP
запроса. Если вы хотите реализовать только сервер веб-сокетов, удалите ['request', SapiEvents::class, 'onRequest']
в конфигурации ./config/conf.php
.
Параметры конфигурации сервера HTTP/websocket находятся в ./config/conf.php
. Конкретную информацию о конфигурации см. в параметрах конфигурации документа Swoole.
<?php
return [
'ws' => [
'host' => '0.0.0.0',//监听地址
'port' => 9501,//监听端口
'events' => [
['open', SapiEvents::class, 'onOpen'],
['message', SapiEvents::class, 'onMessage'],
['close', SapiEvents::class, 'onClose'],
['request', SapiEvents::class, 'onRequest'],//HTTP服务器回调
['Task', SapiEvents::class, 'onTask'],
['Finish', SapiEvents::class, 'onFinish'],
['workerStart', SapiEvents::class, 'onWorkerStart'],
['start', SapiEvents::class, 'onStart'],
],//回调函数
'settings' => [
'daemonize' => false,//设置 daemonize => true 时,程序将转入后台作为守护进程运行。长时间运行的服务器端程序必须启用此项。如果不启用守护进程,当 ssh 终端退出后,程序将被终止运行
'worker_num' => swoole_cpu_num(),
'log_file' => 'storage/swoole',
'log_rotation' => SWOOLE_LOG_ROTATION_DAILY,
'log_date_format' => '%Y-%m-%d %H:%M:%S',
'log_level' => SWOOLE_LOG_DEBUG,
'task_worker_num' => 10,
],
],
];
Файл построения маршрута для HTTP-сервера находится в ./route/http.php
. Объявите конкретные правила маршрутизации. Первый параметр — это определенный адрес доступа браузера. Первая половина второго параметра @
— это полное пространство имен файла. Вторая половина @
это конкретный метод, вызываемый в классе.
return [
HttpRouter("/", "AppExampleApp@Index"),
HttpRouter("/hello", "AppExampleHello@index"),
HttpRouter("声明浏览器地址", "命名空间+类@类中的方法"),
];
Полный URL-адрес состоит из http://ip网址:端口/定义的路由
.
Для построения базового маршрута требуется только URI и闭包
, что обеспечивает очень простой способ определения маршрутов:
return [
HttpRouter("/", function (SwooleHttpRequest $request, SwooleHttpResponse $response) {
return [
"code" => 200,
"msg" => "hello World!",
'tm' => date('Y-m-d H:i:s'),
"data" => [
'name' => 'api-swoole',
'version' => DI()->config->get('conf.version'),
],
];
}),
];
Соответствующий метод контроллера по умолчанию имеет два параметра: $request
и $reponse
. Для полного ознакомления с объектами Request и Response просмотрите документацию Swoole: HttpRequest, HttpResponse.
<?php
namespace AppController;
use SapiApi;
class Hello extends Api
{
public function index()
{
return [
'code' => 200,
'data' => 'hello world'
];
}
}
Правила параметров интерфейса реализуются путем наследования класса Api
, а конкретные правила определения реализуются с помощью метода rule()
.
name
соответствует значению, переданному клиентомrequire
указывает, что значение передается как опция, необходимо передать true
false
.type
, поддерживает int
, string
, float
, bool
, array
, file
source
передается в местоположение и поддерживает get
, post
и header
message
<?php
namespace AppExample;
use SapiApi;
//字段验证
class App extends Api
{
public function rule()
{
return [
'Index' => [
'intValue' => ['name' => 'intValue', 'require' => true, 'type' => 'int', 'source' => 'post', 'message' => 'intValue必须携带'],
'stringValue' => ['name' => 'stringValue', 'require' => true, 'type' => 'string', 'source' => 'post', 'message' => 'stringValue必须携带'],
'floatValue' => ['name' => 'floatValue', 'require' => true, 'type' => 'float', 'source' => 'post', 'message' => 'floatValue是必须的'],
'boolValue' => ['name' => 'boolValue', 'require' => true, 'type' => 'bool', 'source' => 'post', 'message' => 'boolValue是必须的'],
'arrayValue' => ['name' => 'arrayValue', 'require' => true, 'type' => 'array', 'source' => 'post', 'message' => 'arrayValue是必须的'],
'file' => ['name' => 'file', 'require' => false, 'type' => 'file', 'ext' => 'jpeg,png,txt', 'source' => 'post', 'message' => 'file文件是必须的'],
'x-token' => ['name' => 'x-token', 'require' => true, 'type' => 'string', 'source' => 'header', 'message' => '缺少请求头x-token'],
]
];
}
public function Index(SwooleHttpRequest $request, SwooleHttpResponse $response): array
{
return [
"code" => 200,
"msg" => "hello World!",
'tm' => date('Y-m-d H:i:s'),
"data" => [
'name' => 'api-swoole',
'version' => DI()->config->get('conf.version'),
'intValue' => $request->post['intValue'],
'stringValue' => $request->post['stringValue'],
'floatValue' => $request->post['floatValue'],
'boolValue' => $request->post['boolValue'],
'arrayValue' => $request->post['arrayValue'],
'x-token' => $request->header['x-token'],
'file' => saveFile($request, './tmp/')
],
];
}
}
Файл определения маршрута сервера websocket находится в ./route/websocket.php
. Объявите конкретные правила маршрутизации. Первый параметр — это определенный адрес доступа браузера. Первая половина второго параметра @
— это полное пространство имен файла. Вторая половина @
это конкретный метод, вызываемый в классе.
return [
WsRouter("/", "AppExampleWebsocket@index"),
WsRouter("/login", "AppExampleWebsocket@login"),
];
Полный URL-адрес состоит из ws://ip网址:端口
.
Соответствующий метод контроллера по умолчанию имеет два параметра $server
и $msg
. Полное представление об объекте $server
см. в документации Swoole: WebSocketServer. $msg
— это информация о данных, отправленная клиентом.
Информация о данных, отправленная клиентом, по умолчанию должна передаваться в формате json и содержать три поля: идентификатор, путь и данные.
id
— это уникальный идентификатор тела сообщения.path
— это адрес доступа, объявленный маршрутом ./route/websocket.php
.data
— это конкретный параметр сообщения проекта, а метод управления по умолчанию — $msg
. {
"id" : " 918wsEMQDrj0RXxm " ,
"path" : " / " ,
"data" : {
"username" : " api-swoole "
}
}
Пример раздела кода контроллера:
<?php
namespace AppExample;
use SapiApi;
class WebsocketHello extends Api
{
public function hello(SwooleWebSocketServer $server, array $msg): array
{
return [
'err' => 200,
'data' => [
'name' => 'api-swoole',
'version' => DI()->config->get('conf.version'),
]
];
}
}
Правила параметров интерфейса реализуются путем наследования класса Api
, а конкретные правила определения реализуются с помощью метода rule()
.
name
соответствует значению, переданному клиентомrequire
указывает, что значение передается как опция, необходимо передать true
false
.type
тип, поддерживает int
, string
, float
, bool
, array
message
<?php
namespace AppExample;
class Websocket extends WsBase
{
public function rule()
{
return [
'Index' => [
'intValue' => ['name' => 'intValue', 'require' => true, 'type' => 'int', 'message' => 'intValue必须携带'],
'stringValue' => ['name' => 'stringValue', 'require' => true, 'type' => 'string', 'message' => 'stringValue必须携带'],
'floatValue' => ['name' => 'floatValue', 'require' => true, 'type' => 'float', 'message' => 'floatValue是必须的'],
'boolValue' => ['name' => 'boolValue', 'require' => true, 'type' => 'bool', 'message' => 'boolValue是必须的'],
'arrayValue' => ['name' => 'arrayValue', 'require' => true, 'type' => 'array', 'message' => 'arrayValue是必须的'],
'x-token' => ['name' => 'x-token', 'require' => true, 'type' => 'string', 'message' => '缺少请求头x-token'],
]
];
}
public function Index(SwooleWebSocketServer $server, array $msg): array
{
return [
'err' => 200,
'data' => [
'intValue' => $msg['intValue'],
'stringValue' => $msg['stringValue'],
'floatValue' => $msg['floatValue'],
'boolValue' => $msg['boolValue'],
'arrayValue' => $msg['arrayValue'],
'x-token' => $msg['x-token'],
]
];
}
}
Класс Api
имеет встроенную функцию-перехватчик userCheck
, и все контроллеры HTTP могут наследовать перегрузку класса Api
. Например, может быть выполнена аутентификация пользователя.
Сначала определите файл объявления HttpBase.php
.
<?php
namespace AppExample;
use SapiApi;
class HttpBase extends Api
{
//用户权限验证
public function userCheck(SwooleHttpRequest $request): string
{
if ($request->header["x-token"] != "123123") {
return "token过期";
}
return "";
}
}
Затем наследуйте HttpBase.php
для реализации перегрузки классов.
<?php
namespace AppExample;
class Auth extends HttpBase
{
public function rule()
{
return [
'login' => [
'username' => ['name' => 'username', 'require' => true, 'type' => 'string', 'source' => 'post', 'message' => '必须携带username'],
]
];
}
public function login(SwooleHttpRequest $request, SwooleHttpResponse $response): array
{
return [
"code" => 200,
"msg" => "login",
"data" => [
'username' => $request->post['username']
]
];
}
}
Класс Api
имеет встроенную функцию-перехватчик userWsCheck
, и все контроллеры веб-сокетов могут наследовать перегрузку класса Api
. Например, может быть выполнена аутентификация пользователя.
Сначала определите файл объявления WsBase.php
.
<?php
namespace AppExample;
use SapiApi;
class WsBase extends Api
{
public function userWsCheck(SwooleWebSocketFrame $frame): string
{
$res = json_decode($frame->data, true);
if (!isset($res['data']["x-token"]) || $res['data']["x-token"] != "123123") {
return "token expired";
}
return "";
}
}
Затем наследуйте WsBase.php
для реализации перегрузки классов.
<?php
namespace AppExample;
class Websocket extends WsBase
{
public function rule()
{
return [
'Index' => [
'intValue' => ['name' => 'intValue', 'require' => true, 'type' => 'int', 'message' => 'intValue必须携带'],
'stringValue' => ['name' => 'stringValue', 'require' => true, 'type' => 'string', 'message' => 'stringValue必须携带'],
'floatValue' => ['name' => 'floatValue', 'require' => true, 'type' => 'float', 'message' => 'floatValue是必须的'],
'boolValue' => ['name' => 'boolValue', 'require' => true, 'type' => 'bool', 'message' => 'boolValue是必须的'],
'arrayValue' => ['name' => 'arrayValue', 'require' => true, 'type' => 'array', 'message' => 'arrayValue是必须的'],
'x-token' => ['name' => 'x-token', 'require' => true, 'type' => 'string', 'message' => '缺少请求头x-token'],
]
];
}
public function Index(SwooleWebSocketServer $server, array $msg): array
{
return [
'err' => 200,
'data' => [
'intValue' => $msg['intValue'],
'stringValue' => $msg['stringValue'],
'floatValue' => $msg['floatValue'],
'boolValue' => $msg['boolValue'],
'arrayValue' => $msg['arrayValue'],
'x-token' => $msg['x-token'],
]
];
}
}
Server
может прослушивать несколько портов, и каждый порт может быть настроен для работы с разными протоколами. Например, порт 80 обрабатывает протокол HTTP, порт 9500 обрабатывает протокол TCP, а порт 9502 обрабатывает протокол UDP. Транспортное шифрование SSL/TLS
также можно включить только для определенных портов. Обратитесь к официальной документации Swoole (мониторинг нескольких портов).
Параметры конфигурации TCP-сервера добавляют поле tcp в ./config/conf.php
. Конкретную информацию о конфигурации см. в документе Swoole «Конфигурация TCP».
'tcp' => [
'host' => '0.0.0.0',
'port' => 9500,
'sockType' => SWOOLE_SOCK_TCP,
'events' => [
['receive', AppControllerTcpServe::class, 'onReceive'],//TCP服务器回调
],
'settings' => [],
],
Параметры конфигурации UDP-сервера добавляют поле udp в ./config/conf.php
. Конкретную информацию о конфигурации см. в документе Swoole UDP Configuration.
'udp' => [
'host' => '0.0.0.0',
'port' => 9502,
'sockType' => SWOOLE_SOCK_UDP,
'events' => [
['packet', AppControllerUdpServe::class, 'onPacket'],//UDP服务器回调
],
'settings' => [],
],
Команда разработчиков Swoole использует встроенную функцию PHP Hook для реализации клиента сопрограммы. С помощью одной строки кода исходный код синхронного ввода-вывода можно превратить в асинхронный ввод-вывод, который можно запланировать сопрограммой, то есть сопрограммизацию одним щелчком мыши. Кластеры классов SwooleServer, предоставляемые Swoole
создаются автоматически, и их не нужно делать вручную. См. Enable_coroutine. Конкретный контент можно найти на официальном сайте Swoole, где можно создать сопрограмму одним щелчком мыши.
База данных платформы представляет сторонний пакет расширения simple-swoole
. Подробную информацию см. в файле simple-swoole/db.
Параметры конфигурации сервера Redis находятся в ./config/db.php
.
<?php
return [
'redis' => [
'host' => '192.168.0.105',//Redis服务器地址
'port' => 6379,//指定 Redis 监听端口
'auth' => '',//登录密码
'db_index' => 2,//指定数据库
'time_out' => 1,//
'size' => 64,//连接池数量
],
];
Использование Redis в проекте
<?php
namespace AppController;
use AppExtRedis;
class RedisDemo
{
public function setData(SwooleHttpRequest $request, SwooleHttpResponse $response)
{
$redis = new SimpsDBBaseRedis();
$res = $redis->set('我是key', '我是value');
return [
"code" => 200,
"msg" => "hello World!",
"data" => [
'res' => $res,
'key' => $request->get['key'],
'val' => $request->get['val'],
],
];
}
}
Параметры конфигурации сервера MySQL находятся в ./config/db.php
.
<?php
return [
'mysql' => [
'host' => '',//连接地址
'port' => ,//连接端口
'database' => '',//数据库名称
'username' => 'root',//用户
'password' => '',//密码
'charset' => 'utf8',//字符集
'unixSocket' => null,//
'options' => [
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
],
'size' => 64 // 连接池数量
],
];
./app/Ext/Pool.php
настраивает пул соединений:
<?php
namespace AppExt;
use SapiSingleton;
use SimpsDBPDO;
use SimpsDBRedis;
class Pool
{
use Singleton;
public function startPool(...$args)
{
$mysql_config = DI()->config->get('db.mysql');
if (!empty($mysql_config)) {
PDO::getInstance($mysql_config);
}
$redis_config = DI()->config->get('db.redis');
if (!empty($redis_config)) {
Redis::getInstance($redis_config);
}
}
}
simple-swoole
интегрирует облегченную структуру базы данных PHP Medoo. При ее использовании вам необходимо наследовать SimpsDBBaseModel
, поэтому метод использования в основном такой же, как и у Medoo. Подробности см. в документации Medoo.
Единственное отличие — это операции, связанные с транзакциями. В Medoo используется метод action( $callback )
, но в этой среде также можно использовать метод action( $callback )
. Кроме того, также поддерживаются следующие методы.
beginTransaction(); // 开启事务
commit(); // 提交事务
rollBack(); // 回滚事务
Пример транзакции
$this->beginTransaction();
$this->insert("user", [
"name" => "luffy",
"gender" => "1"
]);
$this->delete("user", [
"id" => 2
]);
if ($this->has("user", ["id" => 23]))
{
$this->rollBack();
} else {
$this->commit();
}
Используемая в проекте структура таблицы базы данных:
CREATE TABLE `user_info` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`nick` varchar(15) DEFAULT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8;
<?php
namespace AppController;
class MysqlDemo
{
public function getOne(SwooleHttpRequest $request, SwooleHttpResponse $response)
{
$uid = $request->post['uid'];
$database = new SimpsDBBaseModel();
$res = $database->select("user_info", [
"uid",
"nick",
], [
"uid" => $uid
]);
return [
"code" => 200,
"msg" => "MysqlDemo getOne",
"data" => [
'res' => $res,
'uid' => $uid,
],
];
}
public function save(SwooleHttpRequest $request, SwooleHttpResponse $response)
{
$username = $request->post['username'];
$database = new SimpsDBBaseModel();
$last_user_id = $database->insert("user_info", [
"uid" => time(),
"nick" => $username,
]);
return [
"code" => 200,
"msg" => "MysqlDemo save",
"data" => [
'last_user_id' => $last_user_id,
'username' => $username,
],
];
}
public function del(SwooleHttpRequest $request, SwooleHttpResponse $response)
{
$uid = $request->post['uid'];
$database = new SimpsDBBaseModel();
$res = $database->delete("user_info", [
"uid" => $uid
]);
return [
"code" => 200,
"msg" => "MysqlDemo del",
"data" => [
'res' => $res,
'uid' => $uid,
],
];
}
public function update(SwooleHttpRequest $request, SwooleHttpResponse $response)
{
$uid = $request->post['uid'];
$username = $request->post['username'];
$database = new SimpsDBBaseModel();
$res = $database->update("user_info", [
"nick" => $username
], [
"uid" => $uid
]);
return [
"code" => 200,
"msg" => "MysqlDemo update",
"data" => [
'res' => $res,
'uid' => $uid,
'username' => $username,
],
];
}
}
Добавьте пользовательский рабочий процесс. Эта функция обычно используется для создания специального рабочего процесса для мониторинга, отчетности или других специальных задач. Конкретный контент можно найти на официальном сайте Swoole addProcess .
Что следует отметить:
$server
, например getClientList/getClientInfo/stats
Worker/Task
вы можете вызвать метод, предоставленный $process
для связи с дочерним процессом.$server->sendMessage
для связи с процессом Worker/Task
.Server->task/taskwait
не может использоваться в пользовательском процессе.Server->send/close
while(true)
(как показано в примере ниже) или цикл EventLoop (например, создание таймера), в противном случае пользовательский процесс продолжит завершаться и перезапускаться.Пример использования
Добавьте пользовательский рабочий процесс и добавьте конфигурацию process
в ./config/conf.php
следующим образом:
'process' => [
[AppControllerProcess::class, 'addProcess']
],
Пример контроллера:
<?php
namespace AppController;
class Process
{
//添加用户自定义的工作进程
public function addProcess($server)
{
return new SwooleProcess(function ($process) use ($server) {
while (true) {
Co::sleep(1);
echo "Hello, api-swoole!rn";
}
}, false, 2, 1);
}
}
Платформа по умолчанию зарегистрировала пять настраиваемых событий: workerStart、open、close、task、finish
. Бизнес-код обработки можно добавить к соответствующему обратному вызову события в соответствии с конкретными бизнес-характеристиками. ./confg/events.php
каждое событие допускает несколько обратных вызовов
<?php
return [
'workerStart' => [
[AppExtPool::class, 'startPool'],//启动连接池
// [AppControllerEventsDemo::class, 'workerStart'],
],
'open' => [
[AppControllerEventsDemo::class, 'open'],
],
'close' => [
[AppControllerEventsDemo::class, 'close'],
],
'task' => [
[AppControllerEventsDemo::class, 'task'],
],
'finish' => [
[AppControllerEventsDemo::class, 'finish'],
],
];