贊助商
需要確保運行環境達到了以下的要求:
composer create-project api-swoole/skeleton
支援HTTP 服務、WebSocket 服務、tcp服務,專案根目錄./apiswoole.php
執行指令。
php apiswoole.php
在api-swoole框架中,業務主要程式碼在app目錄中。裡面各個命名空間對應一個子目錄,專案的預設命名空間是App,建立專案後app目錄中包含Common、Example、Ext三個子目錄,Common目錄存放函數的functions.php文件,Ext一般放置工具等。目錄結構如下:
./
└── app
├── Example # 放置接口源代码,相当于控制器层
├── Common # 公共代码目录,
└── Ext# 放置工具等
當專案需要新增介面時,先在./app/Example
目錄中新建hello.php
文件,並用編輯器編輯程式碼。
<?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和websocket的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方式返回,包含預設的code、msg、data字段,data中資料為方法中返回的資料。
{
"code" : 200 ,
"msg" : " success " ,
"data" : {
"code" : 200 ,
"data" : {
"name" : " api-swoole " ,
"version" : " 1.0.2 "
}
},
"debug" : []
}
由於HttpServer
對HTTP
協定的支援並不完整,建議僅作為應用程式伺服器,用於處理動態請求,並且在前端增加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;
}
}
可以透過讀取$request->header['x-real-ip']
來取得客戶端的真實IP
預設config資料夾下包含conf.php、db.php、events.php三個文件,conf.php放置專案的配置訊息,http、tcp、udp、websocket等配置。 db.php負責配置MySQL、Redis連接,events.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,所以HttpServer
提供的所有API
和設定項都可以使用。請參考HttpServer 章節。
WebSocketServer
也可以同時作為HTTP
伺服器WebSocketServer
收到HTTP
請求後會回傳HTTP 400
錯誤頁面如若只想實作websocket伺服器,則在./config/conf.php
配置中刪除['request', SapiEvents::class, 'onRequest']
即可。
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、data三個欄位。
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
,websocket控制器皆可繼承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伺服器設定選項在./config/conf.php
中增加tcp欄位。具體配置資訊可以參考Swoole文檔TCP配置。
'tcp' => [
'host' => '0.0.0.0',
'port' => 9500,
'sockType' => SWOOLE_SOCK_TCP,
'events' => [
['receive', AppControllerTcpServe::class, 'onReceive'],//TCP服务器回调
],
'settings' => [],
],
UDP伺服器設定選項在./config/conf.php
中增加udp欄位。具體配置資訊可以參考Swoole文檔UDP配置。
'udp' => [
'host' => '0.0.0.0',
'port' => 9502,
'sockType' => SWOOLE_SOCK_UDP,
'events' => [
['packet', AppControllerUdpServe::class, 'onPacket'],//UDP服务器回调
],
'settings' => [],
],
Swoole 開發組採用Hook 原生PHP 函數的方式實作協程客戶端,透過一行程式碼就可以讓原來的同步IO 的程式碼變成可以協程調度的非同步IO,也就是一鍵協程化。 Swoole
提供的SwooleServer 類別簇都是自動做好的,不需要手動做,參考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 迴圈(例如建立個定時器) ,否則使用者程序會不停地退出重啟使用範例
新增一個使用者自訂的工作進程,在./config/conf.php
中增加process
配置,如下:
'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'],
],
];