Sponsor
Sie müssen sicherstellen, dass die Betriebsumgebung die folgenden Anforderungen erfüllt:
composer create-project api-swoole/skeleton
Unterstützt HTTP-Dienste, WebSocket-Dienste und TCP-Dienste und führt Befehle im Projektstammverzeichnis ./apiswoole.php
aus.
php apiswoole.php
Im API-Swoole-Framework befindet sich der Hauptgeschäftscode im App-Verzeichnis. Jeder Namespace darin entspricht einem Unterverzeichnis. Der Standard-Namespace des Projekts ist App. Nach der Erstellung des Projekts enthält das App-Verzeichnis drei Unterverzeichnisse: Common, Beispiel und Ext. und Ext platziert im Allgemeinen Werkzeuge usw. Die Verzeichnisstruktur ist wie folgt:
./
└── app
├── Example # 放置接口源代码,相当于控制器层
├── Common # 公共代码目录,
└── Ext# 放置工具等
Wenn das Projekt eine neue Schnittstelle hinzufügen muss, erstellen Sie zunächst eine neue hello.php
Datei im Verzeichnis ./app/Example
und bearbeiten Sie den Code mit einem 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'),
],
];
}
}
Definieren Sie die Projektroute in der Routing-Datei route/http.php
. Die erste Hälfte des zweiten Parameters @
ist der vollständige Namespace der @
in der Klassenmethode.
return [
HttpRouter("/hello", "AppExampleHello@index"),
];
Führen Sie den folgenden Befehl im Projektstammverzeichnis aus, um im Nicht-Daemon-Modus zu starten.
php apiswoole.php
Standardmäßig überwacht es den lokalen HTTP- und WebSocket-Port 9501. Die folgenden Ausgabeinformationen werden in cmd angezeigt, um anzuzeigen, dass das Projekt erfolgreich gestartet wurde.
[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
Geben Sie die definierte Routing-Adresse in die Adressleiste des Browsers ein. Die Adresse besteht aus http://ip网址:端口/定义的路由
.
http://127.0.0.1:9501/hello
Die nach einer erfolgreichen Anfrage zurückgegebenen Daten werden standardmäßig im JSON-Format zurückgegeben, einschließlich des Standardcodes, der Standardnachricht und der Datenfelder. Die Daten in Daten sind die in der Methode zurückgegebenen Daten.
{
"code" : 200 ,
"msg" : " success " ,
"data" : {
"code" : 200 ,
"data" : {
"name" : " api-swoole " ,
"version" : " 1.0.2 "
}
},
"debug" : []
}
Da die Unterstützung von HttpServer
für das HTTP
-Protokoll unvollständig ist, wird empfohlen, es nur als Anwendungsserver zur Verarbeitung dynamischer Anforderungen zu verwenden und Nginx
als Proxy am Frontend hinzuzufügen. (Referenzadresse)
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;
}
}
Sie können die echte IP
des Clients erhalten, indem Sie $request->header['x-real-ip']
lesen.
Der Standardkonfigurationsordner enthält drei Dateien: conf.php, db.php und events.php. Dort werden die Konfigurationsinformationen des Projekts abgelegt, einschließlich http, tcp, udp, websocket und anderer Konfigurationen. db.php ist für die Konfiguration von MySQL- und Redis-Verbindungen verantwortlich, und events.php ist für die Definition und Anpassung spezifischer Ereignisregistrierungen und -überwachungen verantwortlich. Es unterstützt jetzt die Registrierung workerStart、open、close、task、finish
-Ereignissen. Konfigurationsinformationen können über DI()->config->get('conf.ws')
oder SapiDi::one()->config->get('conf.ws')
gelesen werden.
./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']
],//添加用户自定义的工作进程
];
Der Dienst wurde beim Start des Projekts standardmäßig in apiswoole.php
registriert.
$di = DI();
$di->config = new Config("./config");
Die Konfigurationsinformationen lauten beispielsweise conf.php und die Struktur lautet:
return [
'debug' => true,//调试模式
'tcp' => [
'host' => '0.0.0.0',
'port' => 9500,
'sockType' => SWOOLE_SOCK_TCP,
'events' => [
['receive', AppControllerTcpServe::class, 'onReceive'],
],
'settings' => [],
],
]
Sie können DI()->config->get('conf.tcp')
verwenden, um die Konfigurationsdatei zu lesen
DI()->config->get('conf.tcp') #返回数组
Gibt eine Array-Datenstruktur zurück:
{
"host" : " 0.0.0.0 " ,
"port" : 9500 ,
"sockType" : 1 ,
"events" : [
[
" receive " ,
" App \ Controller \ TcpServe " ,
" onReceive "
]
],
"settings" : []
}
Die Protokollschnittstelle ist gemäß der PSR-Spezifikation detailliert definiert. Protokolle werden im Verzeichnis ./storage/log
aufgezeichnet und täglich日期.log
generiert. Derzeit werden die folgenden Arten der Protokollierung unterstützt:
Das Protokollierungssystem verwendet:
DI()->logger->debug("日志测试debug"); #开发调试类日记
DI()->logger->info("日志测试info"); #业务纪录类日记
DI()->logger->notice("日志测试notice");#系统提示类日记
DI()->logger->waring("日志测试waring");#系统致命类日记
DI()->logger->error("日志测试error"); #系统异常类日记
Das entsprechende Protokoll im Verzeichnis ./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
erbt von HttpServer, sodass alle von HttpServer
bereitgestellten API
und Konfigurationselemente verwendet werden können. Weitere Informationen finden Sie im Kapitel „HttpServer“.
WebSocketServer
gleichzeitig auch als HTTP
Server dienen.WebSocketServer
gibt nach dem Empfang der HTTP
Anfrage eine HTTP 400
Fehlerseite zurück. Wenn Sie nur den Websocket-Server implementieren möchten, löschen Sie ['request', SapiEvents::class, 'onRequest']
in der ./config/conf.php
.
Konfigurationsoptionen für HTTP/Websocket-Server finden Sie in ./config/conf.php
. Spezifische Konfigurationsinformationen finden Sie in den Konfigurationsoptionen des Swoole-Dokuments.
<?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,
],
],
];
Die Route-Build-Datei für den HTTP-Server befindet sich in ./route/http.php
. Deklarieren Sie spezifische Routing-Regeln. Die erste Hälfte @
zweiten Parameters @
ist der vollständige Namensraum der Datei.
return [
HttpRouter("/", "AppExampleApp@Index"),
HttpRouter("/hello", "AppExampleHello@index"),
HttpRouter("声明浏览器地址", "命名空间+类@类中的方法"),
];
Die vollständige URL-Adresse besteht aus http://ip网址:端口/定义的路由
.
Für den Aufbau einer Basisroute sind lediglich ein URI und ein闭包
erforderlich, was eine sehr einfache Möglichkeit zum Definieren von Routen darstellt:
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'),
],
];
}),
];
Die entsprechende Controller-Methode verfügt standardmäßig über zwei Parameter, $request
und $reponse
. Eine vollständige Einführung in die Request- und Response-Objekte finden Sie in der Swoole-Dokumentation: HttpRequest, HttpResponse
<?php
namespace AppController;
use SapiApi;
class Hello extends Api
{
public function index()
{
return [
'code' => 200,
'data' => 'hello world'
];
}
}
Schnittstellenparameterregeln werden durch Erben der Api
Klasse implementiert, und spezifische Definitionsregeln werden über rule()
implementiert.
name
entspricht dem vom Client übergebenen Wertrequire
gibt an, dass der Wert als Option übergeben wird, true
muss übergeben werden false
muss übergeben werden.type
, unterstützt int
, string
, float
, bool
, array
, file
source
wird an den Speicherort übergeben und unterstützt get
, post
und 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/')
],
];
}
}
Die Routendefinitionsdatei des Websocket-Servers befindet sich in ./route/websocket.php
. Deklarieren Sie spezifische Routing-Regeln. Die erste Hälfte @
zweiten Parameters @
ist der vollständige Namensraum der Datei.
return [
WsRouter("/", "AppExampleWebsocket@index"),
WsRouter("/login", "AppExampleWebsocket@login"),
];
Die vollständige URL-Adresse besteht aus ws://ip网址:端口
.
Die entsprechende Controller-Methode verfügt standardmäßig über zwei Parameter $server
und $msg
. Eine vollständige Einführung in das $server
Objekt finden Sie in der Swoole-Dokumentation: WebSocketServer. $msg
sind die vom Client gesendeten Dateninformationen.
Die vom Client gesendeten Dateninformationen müssen standardmäßig im JSON-Format übertragen werden und die drei Felder ID, Pfad und Daten enthalten.
id
-Feld ist die eindeutige Kennung des Nachrichtentexts.path
ist die von der Route ./route/websocket.php
deklarierte Zugriffsadresse.data
ist der spezifische Nachrichtenparameter des Projekts und die Standardsteuerungsmethode ist $msg
. {
"id" : " 918wsEMQDrj0RXxm " ,
"path" : " / " ,
"data" : {
"username" : " api-swoole "
}
}
Beispiel für einen Controller-Codeabschnitt:
<?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'),
]
];
}
}
Schnittstellenparameterregeln werden durch Erben der Api
Klasse implementiert, und spezifische Definitionsregeln werden über rule()
implementiert.
name
entspricht dem vom Client übergebenen Wertrequire
gibt an, dass der Wert als Option übergeben wird, true
muss übergeben werden false
muss übergeben werden.type
Typ, unterstützt 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'],
]
];
}
}
Die Api
-Klasse verfügt über eine integrierte Hook-Funktion userCheck
und alle HTTP-Controller können die Überladung der Api
-Klasse erben. Beispielsweise kann eine Benutzerauthentifizierung durchgeführt werden.
Definieren Sie zunächst die Deklarationsdatei 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 "";
}
}
Dann erben Sie HttpBase.php
um eine Klassenüberladung zu implementieren.
<?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']
]
];
}
}
Die Api
-Klasse verfügt über eine integrierte Hook-Funktion userWsCheck
und alle Websocket-Controller können Api
-Klasse erben. Beispielsweise kann eine Benutzerauthentifizierung durchgeführt werden.
Definieren Sie zunächst die Deklarationsdatei 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 "";
}
}
Dann erben Sie WsBase.php
um eine Klassenüberladung zu implementieren.
<?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
kann mehrere Ports abhören, und jeder Port kann für die Verarbeitung unterschiedlicher Protokolle eingestellt werden. Beispielsweise verwaltet Port 80 das HTTP-Protokoll, Port 9500 das TCP-Protokoll und Port 9502 das UDP-Protokoll. SSL/TLS
Transportverschlüsselung kann auch nur für bestimmte Ports aktiviert werden. Weitere Informationen finden Sie in der offiziellen Dokumentation von Swoole (Multi-Port-Überwachung).
Mit den TCP-Serverkonfigurationsoptionen wird das TCP- Feld in ./config/conf.php
hinzugefügt. Spezifische Konfigurationsinformationen finden Sie im Swoole-Dokument TCP-Konfiguration.
'tcp' => [
'host' => '0.0.0.0',
'port' => 9500,
'sockType' => SWOOLE_SOCK_TCP,
'events' => [
['receive', AppControllerTcpServe::class, 'onReceive'],//TCP服务器回调
],
'settings' => [],
],
UDP-Serverkonfigurationsoptionen fügen das UDP- Feld in ./config/conf.php
hinzu. Spezifische Konfigurationsinformationen finden Sie im Swoole-Dokument UDP-Konfiguration.
'udp' => [
'host' => '0.0.0.0',
'port' => 9502,
'sockType' => SWOOLE_SOCK_UDP,
'events' => [
['packet', AppControllerUdpServe::class, 'onPacket'],//UDP服务器回调
],
'settings' => [],
],
Das Swoole-Entwicklungsteam verwendet die native PHP-Funktion von Hook, um den Coroutine-Client zu implementieren. Mit einer Codezeile kann der ursprüngliche synchrone E/A-Code in asynchrone E/A umgewandelt werden, die von der Coroutine geplant werden kann, also eine Ein-Klick-Coroutine. Die von Swoole
bereitgestellten SwooleServer-Klassencluster werden automatisch erstellt und müssen nicht manuell erstellt werden. Weitere Informationen finden Sie unter „enable_coroutine“. Spezifische Inhalte finden Sie auf der offiziellen Website von Swoole zur Ein-Klick-Koroutineisierung.
Die Framework-Datenbank führt das Drittanbieter-Erweiterungspaket simple-swoole
ein. Weitere Informationen finden Sie unter simple-swoole/db.
Die Konfigurationsoptionen für den Redis-Server finden Sie in ./config/db.php
.
<?php
return [
'redis' => [
'host' => '192.168.0.105',//Redis服务器地址
'port' => 6379,//指定 Redis 监听端口
'auth' => '',//登录密码
'db_index' => 2,//指定数据库
'time_out' => 1,//
'size' => 64,//连接池数量
],
];
Verwendung von Redis im Projekt
<?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'],
],
];
}
}
Die Konfigurationsoptionen für den MySQL-Server finden Sie in ./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
konfiguriert den Verbindungspool:
<?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
integriert das leichte PHP-Datenbank-Framework Medoo. Sie müssen SimpsDBBaseModel
erben, daher ist die Verwendungsmethode im Wesentlichen die gleiche wie bei Medoo. Weitere Informationen finden Sie in der Dokumentation von Medoo.
Der einzige Unterschied besteht in den transaktionsbezogenen Operationen. In Medoo wird action( $callback )
verwendet, in diesem Framework kann jedoch auch action( $callback )
verwendet werden
beginTransaction(); // 开启事务
commit(); // 提交事务
rollBack(); // 回滚事务
Transaktionsbeispiel
$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();
}
Im Projekt verwendete Datenbanktabellenstruktur:
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,
],
];
}
}
Fügen Sie einen benutzerdefinierten Arbeitsprozess hinzu. Diese Funktion wird normalerweise verwendet, um einen speziellen Arbeitsprozess für Überwachung, Berichterstellung oder andere spezielle Aufgaben zu erstellen. Spezifische Inhalte finden Sie auf der offiziellen Swoole-Website addProcess
Dinge zu beachten:
$server
Objekt bereitgestellte Methoden aufrufen, z. B. getClientList/getClientInfo/stats
Worker/Task
-Prozess können Sie die von $process
bereitgestellte Methode aufrufen, um mit dem untergeordneten Prozess zu kommunizieren.$server->sendMessage
aufrufen, um mit dem Worker/Task
Prozess zu kommunizieren.Server->task/taskwait
Schnittstelle kann im Benutzerprozess nicht verwendet werden.Server->send/close
verwendenwhile(true)
(wie im Beispiel unten gezeigt) oder eine EventLoop-Schleife (z. B. Erstellen eines Timers) ausführen, andernfalls wird der Benutzerprozess weiterhin beendet und neu gestartet.Anwendungsbeispiel
Fügen Sie einen benutzerdefinierten Arbeitsprozess hinzu und fügen Sie process
in ./config/conf.php
wie folgt hinzu:
'process' => [
[AppControllerProcess::class, 'addProcess']
],
Controller-Beispiel:
<?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);
}
}
Das Framework hat standardmäßig fünf benutzerdefinierte Ereignisse registriert: workerStart、open、close、task、finish
. Der Verarbeitungsgeschäftscode kann entsprechend bestimmten Geschäftsmerkmalen zum entsprechenden Ereignisrückruf hinzugefügt werden. ./confg/events.php
, jedes Ereignis erlaubt mehrere Rückrufe
<?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'],
],
];