Parrainer
Vous devez vous assurer que l'environnement d'exploitation répond aux exigences suivantes :
composer create-project api-swoole/skeleton
Prend en charge le service HTTP, le service WebSocket, le service TCP et exécute les commandes dans le répertoire racine du projet ./apiswoole.php
.
php apiswoole.php
Dans le framework api-swoole, le code métier principal se trouve dans le répertoire des applications. Chaque espace de noms à l'intérieur correspond à un sous-répertoire. L'espace de noms par défaut du projet est App. Une fois le projet créé, le répertoire app contient trois sous-répertoires : Common, Sample et Ext. et Ext place généralement des outils, etc. La structure des répertoires est la suivante :
./
└── app
├── Example # 放置接口源代码,相当于控制器层
├── Common # 公共代码目录,
└── Ext# 放置工具等
Lorsque le projet doit ajouter une nouvelle interface, créez d'abord un nouveau fichier hello.php
dans le répertoire ./app/Example
et modifiez le code avec un éditeur.
<?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'),
],
];
}
}
Définissez la route du projet dans le fichier de routage route/http.php
. La première moitié du deuxième paramètre @
est l'espace de noms complet du @
. dans la méthode de classe.
return [
HttpRouter("/hello", "AppExampleHello@index"),
];
Exécutez la commande suivante dans le répertoire racine du projet pour démarrer en mode non-démon.
php apiswoole.php
Par défaut, il écoute le port HTTP et websocket local 9501. Les informations de sortie suivantes apparaissent dans cmd pour indiquer que le projet a démarré avec succès.
[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
Entrez l'adresse de routage définie dans la barre d'adresse du navigateur et l'adresse se compose de http://ip网址:端口/定义的路由
.
http://127.0.0.1:9501/hello
Les données renvoyées après une requête réussie sont renvoyées au format json par défaut, y compris les champs de code, de message et de données par défaut. Les données dans data sont les données renvoyées dans la méthode.
{
"code" : 200 ,
"msg" : " success " ,
"data" : {
"code" : 200 ,
"data" : {
"name" : " api-swoole " ,
"version" : " 1.0.2 "
}
},
"debug" : []
}
Étant donné que la prise en charge du protocole HTTP
par HttpServer
est incomplète, il est recommandé de l'utiliser uniquement comme serveur d'applications pour gérer les requêtes dynamiques et d'ajouter Nginx
comme proxy sur le front-end. (adresse de référence)
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;
}
}
Vous pouvez obtenir la véritable IP
du client en lisant $request->header['x-real-ip']
Le dossier de configuration par défaut contient trois fichiers : conf.php, db.php et events.php. conf.php contient les informations de configuration du projet, notamment http, tcp, udp, websocket et d'autres configurations. db.php est responsable de la configuration des connexions MySQL et Redis, et events.php est responsable de la définition et de la personnalisation de l'enregistrement et de la surveillance d'événements spécifiques. Il prend désormais en charge l'enregistrement des événements workerStart、open、close、task、finish
. Les informations de configuration peuvent être lues via DI()->config->get('conf.ws')
ou 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']
],//添加用户自定义的工作进程
];
Le service a été enregistré par défaut dans apiswoole.php
au démarrage du projet.
$di = DI();
$di->config = new Config("./config");
Par exemple, les informations de configuration sont conf.php et la structure est :
return [
'debug' => true,//调试模式
'tcp' => [
'host' => '0.0.0.0',
'port' => 9500,
'sockType' => SWOOLE_SOCK_TCP,
'events' => [
['receive', AppControllerTcpServe::class, 'onReceive'],
],
'settings' => [],
],
]
Vous pouvez utiliser DI()->config->get('conf.tcp')
pour lire le fichier de configuration
DI()->config->get('conf.tcp') #返回数组
Renvoie une structure de données de tableau :
{
"host" : " 0.0.0.0 " ,
"port" : 9500 ,
"sockType" : 1 ,
"events" : [
[
" receive " ,
" App \ Controller \ TcpServe " ,
" onReceive "
]
],
"settings" : []
}
L'interface des journaux est définie en détail selon la spécification PSR. Les journaux sont enregistrés dans le répertoire ./storage/log
et日期.log
sont générés quotidiennement. Actuellement, les types de journalisation suivants sont pris en charge :
Le système de journalisation utilise :
DI()->logger->debug("日志测试debug"); #开发调试类日记
DI()->logger->info("日志测试info"); #业务纪录类日记
DI()->logger->notice("日志测试notice");#系统提示类日记
DI()->logger->waring("日志测试waring");#系统致命类日记
DI()->logger->error("日志测试error"); #系统异常类日记
Le journal correspondant dans le répertoire ./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
hérite de HttpServer, donc toutes API
et éléments de configuration fournis par HttpServer
peuvent être utilisés. Veuillez vous référer au chapitre HttpServeur.
WebSocketServer
peut également servir de serveur HTTP
en même temps.WebSocketServer
renverra une page d'erreur HTTP 400
après avoir reçu la requête HTTP
. Si vous souhaitez uniquement implémenter le serveur websocket, supprimez ['request', SapiEvents::class, 'onRequest']
dans la configuration ./config/conf.php
.
Les options de configuration du serveur HTTP/websocket se trouvent dans ./config/conf.php
. Pour des informations de configuration spécifiques, veuillez vous référer aux options de configuration du document 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,
],
],
];
Le fichier de construction de route pour le serveur HTTP se trouve dans ./route/http.php
. Déclarez des règles de routage spécifiques. La première moitié du deuxième paramètre @
est l'espace de noms complet du fichier. La seconde moitié de @
est la méthode spécifique appelée dans la classe.
return [
HttpRouter("/", "AppExampleApp@Index"),
HttpRouter("/hello", "AppExampleHello@index"),
HttpRouter("声明浏览器地址", "命名空间+类@类中的方法"),
];
L'adresse URL complète se compose de http://ip网址:端口/定义的路由
.
Construire une route de base ne nécessite qu'un URI et une闭包
, offrant un moyen très simple de définir des routes :
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'),
],
];
}),
];
La méthode du contrôleur correspondante a deux paramètres, $request
et $reponse
, par défaut. Pour une introduction complète aux objets Request et Response, veuillez consulter la documentation Swoole : HttpRequest, HttpResponse.
<?php
namespace AppController;
use SapiApi;
class Hello extends Api
{
public function index()
{
return [
'code' => 200,
'data' => 'hello world'
];
}
}
Les règles de paramètres d'interface sont implémentées en héritant de la classe Api
, et des règles de définition spécifiques sont implémentées via rule()
.
name
correspond à la valeur transmise par le clientrequire
indique que la valeur est transmise en option, true
doit être transmis false
doit être transmis.type
, prend en charge int
, string
, float
, bool
, array
, file
source
est transmis à l'emplacement et prend en charge get
, post
et 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/')
],
];
}
}
Le fichier de définition de route du serveur websocket se trouve dans ./route/websocket.php
. Déclarez des règles de routage spécifiques. La première moitié du deuxième paramètre @
est l'espace de noms complet du fichier. La seconde moitié de @
est la méthode spécifique appelée dans la classe.
return [
WsRouter("/", "AppExampleWebsocket@index"),
WsRouter("/login", "AppExampleWebsocket@login"),
];
L'adresse URL complète se compose de ws://ip网址:端口
.
La méthode de contrôleur correspondante a deux paramètres $server
et $msg
, par défaut. Pour une introduction complète à l'objet $server
, veuillez consulter la documentation Swoole : WebSocketServer. $msg
sont les informations de données envoyées par le client.
Les informations de données envoyées par le client doivent être transmises au format json par défaut et doivent contenir les trois champs id, path et data.
id
est l'identifiant unique du corps du message.path
est l'adresse d'accès déclarée par la route ./route/websocket.php
.data
est le paramètre de message spécifique du projet et la méthode de contrôle par défaut est $msg
. {
"id" : " 918wsEMQDrj0RXxm " ,
"path" : " / " ,
"data" : {
"username" : " api-swoole "
}
}
Exemple de section de code de contrôleur :
<?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'),
]
];
}
}
Les règles de paramètres d'interface sont implémentées en héritant de la classe Api
, et des règles de définition spécifiques sont implémentées via rule()
.
name
correspond à la valeur transmise par le clientrequire
indique que la valeur est transmise en option, true
doit être transmis false
doit être transmis.type
, prend en charge 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 classe Api
possède une fonction de hook intégrée userCheck
, et tous les contrôleurs HTTP peuvent hériter de la surcharge de la classe Api
. Par exemple, l'authentification des utilisateurs peut être réalisée.
Définissez d’abord le fichier de déclaration 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 "";
}
}
Héritez ensuite HttpBase.php
pour implémenter la surcharge de classe.
<?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 classe Api
a une fonction de hook intégrée userWsCheck
, et tous les contrôleurs Websocket peuvent hériter de Api
. Par exemple, l'authentification des utilisateurs peut être réalisée.
Définissez d’abord le fichier de déclaration 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 "";
}
}
Héritez ensuite WsBase.php
pour implémenter la surcharge de classe.
<?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
peut écouter plusieurs ports et chaque port peut être configuré pour gérer différents protocoles. Par exemple, le port 80 gère le protocole HTTP, le port 9500 gère le protocole TCP et le port 9502 gère le protocole UDP. Le chiffrement du transport SSL/TLS
peut également être activé uniquement pour des ports spécifiques. Reportez-vous à la documentation officielle de Swoole (surveillance multi-ports)
Les options de configuration du serveur TCP ajoutent le champ TCP dans ./config/conf.php
. Pour des informations de configuration spécifiques, veuillez vous référer au document Swoole Configuration TCP.
'tcp' => [
'host' => '0.0.0.0',
'port' => 9500,
'sockType' => SWOOLE_SOCK_TCP,
'events' => [
['receive', AppControllerTcpServe::class, 'onReceive'],//TCP服务器回调
],
'settings' => [],
],
Les options de configuration du serveur UDP ajoutent le champ udp dans ./config/conf.php
. Pour des informations de configuration spécifiques, veuillez vous référer au document Swoole Configuration UDP.
'udp' => [
'host' => '0.0.0.0',
'port' => 9502,
'sockType' => SWOOLE_SOCK_UDP,
'events' => [
['packet', AppControllerUdpServe::class, 'onPacket'],//UDP服务器回调
],
'settings' => [],
],
L'équipe de développement de Swoole utilise la fonction PHP native de Hook pour implémenter le client coroutine. Avec une seule ligne de code, le code IO synchrone d'origine peut être transformé en IO asynchrone qui peut être planifiée par la coroutine, c'est-à-dire une coroutineisation en un clic. Les clusters de classes SwooleServer fournis par Swoole
sont automatiquement créés et n'ont pas besoin d'être créés manuellement. Veuillez vous référer à activate_coroutine. Pour un contenu spécifique, veuillez vous référer au site officiel de Swoole pour une coroutineisation en un clic.
La base de données framework introduit le package d'extension tiers simple-swoole
. Pour plus de détails, veuillez vous référer à simple-swoole/db.
Les options de configuration du serveur Redis se trouvent dans ./config/db.php
.
<?php
return [
'redis' => [
'host' => '192.168.0.105',//Redis服务器地址
'port' => 6379,//指定 Redis 监听端口
'auth' => '',//登录密码
'db_index' => 2,//指定数据库
'time_out' => 1,//
'size' => 64,//连接池数量
],
];
Utiliser Redis dans le projet
<?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'],
],
];
}
}
Les options de configuration du serveur MySQL se trouvent dans ./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
configure le pool de connexions :
<?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
intègre le framework de base de données PHP léger Medoo. Vous devez hériter SimpsDBBaseModel
lors de son utilisation, donc la méthode d'utilisation est fondamentalement la même que celle de Medoo.
La seule différence réside dans les opérations liées aux transactions. Dans Medoo, action( $callback )
est utilisée, mais dans ce cadre, action( $callback )
peut également être utilisée.
beginTransaction(); // 开启事务
commit(); // 提交事务
rollBack(); // 回滚事务
Exemple de transaction
$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();
}
Utilisé dans le projet, structure de table de base de données :
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,
],
];
}
}
Ajoutez un processus de travail défini par l'utilisateur. Cette fonction est généralement utilisée pour créer un processus de travail spécial pour la surveillance, le reporting ou d'autres tâches spéciales. Pour un contenu spécifique, veuillez vous référer au site officiel de Swoole addProcess
Choses à noter :
$server
, telles que getClientList/getClientInfo/stats
Worker/Task
, vous pouvez appeler la méthode fournie par $process
pour communiquer avec le processus enfant.$server->sendMessage
pour communiquer avec le processus Worker/Task
.Server->task/taskwait
ne peut pas être utilisée dans le processus utilisateur.Server->send/close
while(true)
(comme indiqué dans l'exemple ci-dessous) ou une boucle EventLoop (comme la création d'une minuterie), sinon le processus utilisateur continuera à se terminer et à redémarrer.Exemple d'utilisation
Ajoutez un processus de travail défini par l'utilisateur et ajoutez la configuration process
dans ./config/conf.php
comme suit :
'process' => [
[AppControllerProcess::class, 'addProcess']
],
Exemple de contrôleur :
<?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);
}
}
Le framework a enregistré par défaut cinq événements personnalisés : workerStart、open、close、task、finish
. Le code métier de traitement peut être ajouté au rappel d'événement correspondant en fonction de caractéristiques métier spécifiques. ./confg/events.php
, chaque événement permet plusieurs rappels
<?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'],
],
];