スポンサー
動作環境が次の要件を満たしていることを確認する必要があります。
composer create-project api-swoole/skeleton
HTTP サービス、WebSocket サービス、tcp サービスをサポートし、プロジェクトのルート ディレクトリ./apiswoole.php
でコマンドを実行します。
php apiswoole.php
api-swoole フレームワークでは、メインのビジネス コードはアプリ ディレクトリにあります。内部の各名前空間はサブディレクトリに対応します。プロジェクトの作成後、app ディレクトリには Common、Example、および Ext の 3 つのサブディレクトリが含まれます。 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 形式で返されます。 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 の 3 つのファイルが含まれています。conf.php には、http、tcp、udp、websocket およびその他の構成を含む、プロジェクトの構成情報が配置されます。 db.php は MySQL と Redis 接続の構成を担当し、events.php は特定のイベント登録と監視の定義とカスタマイズを担当します。workerStart 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
にあります。特定のルーティング ルールを宣言します。最初のパラメータは、定義されたブラウザ アクセス アドレスです。2 番目のパラメータの前半は、ファイルの完全な名前空間です。 @
の後半は@
クラス内で呼び出される特定のメソッドです。
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
という 2 つのパラメーターがあります。 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
にあります。特定のルーティング ルールを宣言します。最初のパラメータは、定義されたブラウザ アクセス アドレスです。2 番目のパラメータの前半は、ファイルの完全な名前空間です。 @
の後半は@
クラス内で呼び出される特定のメソッドです。
return [
WsRouter("/", "AppExampleWebsocket@index"),
WsRouter("/login", "AppExampleWebsocket@login"),
];
完全な URL アドレスはws://ip网址:端口
で構成されます。
対応するコントローラー メソッドには、デフォルトで$server
と$msg
2 つのパラメーターがあります。 $server
オブジェクトの詳細については、Swoole ドキュメント (WebSocketServer) を参照してください。 $msg
クライアントから送信されたデータ情報です。
クライアントから送信されるデータ情報は、デフォルトでは json 形式で送信する必要があり、id、path、data の 3 つのフィールドが含まれている必要があります。
id
フィールドはメッセージ本文の一意の識別子です。path
フィールドは、 ./route/websocket.php
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 関数を使用して、1 行のコードで、元の同期 IO コードを、コルーチンによってスケジュールできる非同期 IO に変換できます。つまり、ワンクリックのコルーチン化です。 Swoole
が提供する SwooleServer クラス クラスターは自動的に作成されるため、手動で行う必要はありません。enable_coroutine を参照してください。具体的な内容については、ワンクリックコルーチン化に関するSwooleの公式Webサイトを参照してください。
フレームワーク データベースには、 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 では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公式サイトをご覧ください。
注意すべき点:
$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);
}
}
フレームワークには、デフォルトで 5 つのカスタマイズされたイベント ( 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'],
],
];