Patrocinador
Debe asegurarse de que el entorno operativo cumpla con los siguientes requisitos:
composer create-project api-swoole/skeleton
Admite el servicio HTTP, el servicio WebSocket, el servicio tcp y ejecuta comandos en el directorio raíz del proyecto ./apiswoole.php
.
php apiswoole.php
En el marco api-swoole, el código comercial principal está en el directorio de la aplicación. Cada espacio de nombres dentro corresponde a un subdirectorio. El espacio de nombres predeterminado del proyecto es App. Una vez creado el proyecto, el directorio de la aplicación contiene tres subdirectorios: Común, Ejemplo y Ext. El directorio común almacena el archivo funciones.php. y Ext generalmente coloca herramientas, etc. La estructura del directorio es la siguiente:
./
└── app
├── Example # 放置接口源代码,相当于控制器层
├── Common # 公共代码目录,
└── Ext# 放置工具等
Cuando el proyecto necesite agregar una nueva interfaz, primero cree un nuevo archivo hello.php
en el directorio ./app/Example
y edite el código con un editor.
<?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'),
],
];
}
}
Defina la ruta del proyecto en el archivo de enrutamiento route/http.php
. El primer parámetro es la dirección de acceso del navegador definida. La primera mitad del segundo parámetro @
es el espacio de nombres completo del archivo. La segunda mitad de @
es el nombre específico llamado. en la clase.
return [
HttpRouter("/hello", "AppExampleHello@index"),
];
Ejecute el siguiente comando en el directorio raíz del proyecto para iniciar en modo no demonio.
php apiswoole.php
De forma predeterminada, escucha el HTTP local y el puerto websocket 9501. La siguiente información de salida aparece en cmd para indicar que el proyecto se inició correctamente.
[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
Ingrese la dirección de enrutamiento definida en la barra de direcciones del navegador y la dirección consta de http://ip网址:端口/定义的路由
.
http://127.0.0.1:9501/hello
Los datos devueltos después de una solicitud exitosa se devuelven en formato json de forma predeterminada, incluidos el código predeterminado, el mensaje y los campos de datos. Los datos en los datos son los datos devueltos en el método.
{
"code" : 200 ,
"msg" : " success " ,
"data" : {
"code" : 200 ,
"data" : {
"name" : " api-swoole " ,
"version" : " 1.0.2 "
}
},
"debug" : []
}
Dado que el soporte de HttpServer
para el protocolo HTTP
es incompleto, se recomienda usarlo solo como servidor de aplicaciones para manejar solicitudes dinámicas y agregar Nginx
como proxy en el front-end. (dirección de referencia)
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;
}
}
Puede obtener la IP
real del cliente leyendo $request->header['x-real-ip']
La carpeta de configuración predeterminada contiene tres archivos: conf.php, db.php y events.php. conf.php coloca la información de configuración del proyecto, incluidas http, tcp, udp, websocket y otras configuraciones. db.php es responsable de configurar las conexiones MySQL y Redis, y events.php es responsable de definir y personalizar el registro y monitoreo de eventos específicos. Ahora admite el registro de eventos workerStart、open、close、task、finish
. La información de configuración se puede leer a través de DI()->config->get('conf.ws')
o 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']
],//添加用户自定义的工作进程
];
El servicio se ha registrado por defecto en apiswoole.php
cuando se inicia el proyecto.
$di = DI();
$di->config = new Config("./config");
Por ejemplo, la información de configuración es conf.php y la estructura es:
return [
'debug' => true,//调试模式
'tcp' => [
'host' => '0.0.0.0',
'port' => 9500,
'sockType' => SWOOLE_SOCK_TCP,
'events' => [
['receive', AppControllerTcpServe::class, 'onReceive'],
],
'settings' => [],
],
]
Puede usar DI()->config->get('conf.tcp')
para leer el archivo de configuración
DI()->config->get('conf.tcp') #返回数组
Devuelve una estructura de datos de matriz:
{
"host" : " 0.0.0.0 " ,
"port" : 9500 ,
"sockType" : 1 ,
"events" : [
[
" receive " ,
" App \ Controller \ TcpServe " ,
" onReceive "
]
],
"settings" : []
}
La interfaz de registro se define en detalle de acuerdo con la especificación PSR. Los registros se registran en el directorio ./storage/log
y日期.log
se generan diariamente. Actualmente se admiten los siguientes tipos de registro:
Usos del sistema de registro:
DI()->logger->debug("日志测试debug"); #开发调试类日记
DI()->logger->info("日志测试info"); #业务纪录类日记
DI()->logger->notice("日志测试notice");#系统提示类日记
DI()->logger->waring("日志测试waring");#系统致命类日记
DI()->logger->error("日志测试error"); #系统异常类日记
El registro correspondiente en el directorio ./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
hereda de HttpServer, por lo que se pueden utilizar todas API
y elementos de configuración proporcionados por HttpServer
. Consulte el capítulo HttpServer.
WebSocketServer
también puede servir como servidor HTTP
al mismo tiempo.WebSocketServer
devolverá una página de error HTTP 400
después de recibir la solicitud HTTP
. Si solo desea implementar el servidor websocket, elimine ['request', SapiEvents::class, 'onRequest']
en la configuración ./config/conf.php
.
Las opciones de configuración del servidor HTTP/websocket se encuentran en ./config/conf.php
. Para obtener información de configuración específica, consulte las opciones de configuración del documento 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,
],
],
];
El archivo de compilación de ruta para el servidor HTTP se encuentra en ./route/http.php
. Declare reglas de enrutamiento específicas. El primer parámetro es la dirección de acceso del navegador definida. La primera mitad del segundo parámetro @
es el espacio de nombres completo del archivo. La segunda mitad de @
es el método específico llamado en la clase.
return [
HttpRouter("/", "AppExampleApp@Index"),
HttpRouter("/hello", "AppExampleHello@index"),
HttpRouter("声明浏览器地址", "命名空间+类@类中的方法"),
];
La dirección URL completa consta de http://ip网址:端口/定义的路由
.
Construir una ruta básica solo requiere un URI y un闭包
, lo que proporciona una forma muy sencilla de definir rutas:
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'),
],
];
}),
];
El método de controlador correspondiente tiene dos parámetros, $request
y $reponse
, de forma predeterminada. Para obtener una introducción completa a los objetos Solicitud y Respuesta, consulte la documentación de Swoole: HttpRequest, HttpResponse.
<?php
namespace AppController;
use SapiApi;
class Hello extends Api
{
public function index()
{
return [
'code' => 200,
'data' => 'hello world'
];
}
}
Las reglas de parámetros de interfaz se implementan heredando la clase Api
y las reglas de definición específicas se implementan mediante rule()
.
name
corresponde al valor pasado por el cliente.require
indica que el valor se pasa como una opción, se debe pasar true
false
.type
de entrada, admite int
, string
, float
, bool
, array
, file
source
se pasa a la ubicación y admite get
, post
y 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/')
],
];
}
}
El archivo de definición de ruta del servidor websocket se encuentra en ./route/websocket.php
. Declare reglas de enrutamiento específicas. El primer parámetro es la dirección de acceso del navegador definida. La primera mitad del segundo parámetro @
es el espacio de nombres completo del archivo. La segunda mitad de @
es el método específico llamado en la clase.
return [
WsRouter("/", "AppExampleWebsocket@index"),
WsRouter("/login", "AppExampleWebsocket@login"),
];
La dirección URL completa consta de ws://ip网址:端口
.
El método de controlador correspondiente tiene dos parámetros $server
y $msg
, de forma predeterminada. Para obtener una introducción completa al objeto $server
, consulte la documentación de Swoole: WebSocketServer. $msg
es la información de datos enviada por el cliente.
La información de datos enviada por el cliente debe transmitirse en formato json de forma predeterminada y debe contener los tres campos de identificación, ruta y datos.
id
es el identificador único del cuerpo del mensaje.path
es la dirección de acceso declarada por la ruta ./route/websocket.php
.data
es el parámetro de mensaje específico del proyecto y el método de control predeterminado es $msg
. {
"id" : " 918wsEMQDrj0RXxm " ,
"path" : " / " ,
"data" : {
"username" : " api-swoole "
}
}
Ejemplo de sección de código de controlador:
<?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'),
]
];
}
}
Las reglas de parámetros de interfaz se implementan heredando la clase Api
y las reglas de definición específicas se implementan mediante rule()
.
name
corresponde al valor pasado por el cliente.require
indica que el valor se pasa como una opción, se debe pasar true
false
.type
, admite 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'],
]
];
}
}
La clase Api
tiene una función de enlace incorporada userCheck
y todos los controladores HTTP pueden heredar la sobrecarga de la clase Api
. Por ejemplo, se puede lograr la autenticación del usuario.
Primero defina el archivo de declaración 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 "";
}
}
Luego herede HttpBase.php
para implementar la sobrecarga de clases.
<?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']
]
];
}
}
La clase Api
tiene una función de enlace incorporada userWsCheck
y todos los controladores websocket pueden heredar Api
. Por ejemplo, se puede lograr la autenticación del usuario.
Primero defina el archivo de declaración 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 "";
}
}
Luego herede WsBase.php
para implementar la sobrecarga de clases.
<?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
puede escuchar varios puertos y cada puerto se puede configurar para manejar diferentes protocolos. Por ejemplo, el puerto 80 maneja el protocolo HTTP, el puerto 9500 maneja el protocolo TCP y el puerto 9502 maneja el protocolo UDP. El cifrado de transporte SSL/TLS
también se puede habilitar solo para puertos específicos. Consulte la documentación oficial de Swoole (monitoreo multipuerto)
Las opciones de configuración del servidor TCP agregan el campo tcp en ./config/conf.php
. Para obtener información de configuración específica, consulte la configuración TCP del documento Swoole.
'tcp' => [
'host' => '0.0.0.0',
'port' => 9500,
'sockType' => SWOOLE_SOCK_TCP,
'events' => [
['receive', AppControllerTcpServe::class, 'onReceive'],//TCP服务器回调
],
'settings' => [],
],
Las opciones de configuración del servidor UDP agregan el campo udp en ./config/conf.php
. Para obtener información de configuración específica, consulte el documento Swoole Configuración UDP.
'udp' => [
'host' => '0.0.0.0',
'port' => 9502,
'sockType' => SWOOLE_SOCK_UDP,
'events' => [
['packet', AppControllerUdpServe::class, 'onPacket'],//UDP服务器回调
],
'settings' => [],
],
El equipo de desarrollo de Swoole utiliza la función PHP nativa de Hook para implementar el cliente de rutina. Con una línea de código, el código IO sincrónico original se puede convertir en IO asincrónico que la rutina puede programar, es decir, corrutina con un solo clic. Los clústeres de clases SwooleServer proporcionados por Swoole
se crean automáticamente y no es necesario hacerlo manualmente. Consulte enable_coroutine. Para contenido específico, consulte el sitio web oficial de Swoole para realizar rutinas con un solo clic.
La base de datos del marco presenta el paquete de expansión de terceros simple-swoole
. Para obtener más información, consulte simple-swoole/db.
Las opciones de configuración del servidor Redis se encuentran en ./config/db.php
.
<?php
return [
'redis' => [
'host' => '192.168.0.105',//Redis服务器地址
'port' => 6379,//指定 Redis 监听端口
'auth' => '',//登录密码
'db_index' => 2,//指定数据库
'time_out' => 1,//
'size' => 64,//连接池数量
],
];
Usando Redis en el proyecto
<?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'],
],
];
}
}
Las opciones de configuración del servidor MySQL están en ./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
configura el grupo de conexiones:
<?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
integra el marco de base de datos PHP liviano Medoo. Debe heredar SimpsDBBaseModel
al usarlo, por lo que el método de uso es básicamente el mismo que el de Medoo. Consulte la documentación de Medoo para obtener más detalles.
La única diferencia son las operaciones relacionadas con las transacciones. En Medoo, se usa action( $callback )
, pero en este marco, también se puede usar action( $callback )
. Además, también se admiten los siguientes métodos.
beginTransaction(); // 开启事务
commit(); // 提交事务
rollBack(); // 回滚事务
Ejemplo de transacción
$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();
}
Utilizado en el proyecto, estructura de la tabla de la base de datos:
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,
],
];
}
}
Agregue un proceso de trabajo definido por el usuario. Esta función generalmente se usa para crear un proceso de trabajo especial para monitorear, generar informes u otras tareas especiales. Para contenido específico, consulte el sitio web oficial de Swoole addProcess
Cosas a tener en cuenta:
$server
, como getClientList/getClientInfo/stats
Worker/Task
, puede llamar al método proporcionado por $process
para comunicarse con el proceso hijo.$server->sendMessage
para comunicarse con el proceso Worker/Task
.Server->task/taskwait
no se puede utilizar en el proceso del usuario.Server->send/close
while(true)
(como se muestra en el ejemplo siguiente) o un bucle EventLoop (como crear un temporizador); de lo contrario, el proceso de usuario continuará saliendo y reiniciándose.Ejemplo de uso
Agregue un proceso de trabajo definido por el usuario y agregue la configuración process
en ./config/conf.php
de la siguiente manera:
'process' => [
[AppControllerProcess::class, 'addProcess']
],
Ejemplo de controlador:
<?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);
}
}
El marco ha registrado de forma predeterminada cinco eventos personalizados: workerStart、open、close、task、finish
. El código comercial de procesamiento se puede agregar a la devolución de llamada del evento correspondiente de acuerdo con las características comerciales específicas. ./confg/events.php
, cada evento permite múltiples devoluciones de llamada
<?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'],
],
];