Sponsor
Anda perlu memastikan bahwa lingkungan pengoperasian memenuhi persyaratan berikut:
composer create-project api-swoole/skeleton
Mendukung layanan HTTP, layanan WebSocket, layanan tcp, dan menjalankan perintah di direktori root proyek ./apiswoole.php
.
php apiswoole.php
Dalam kerangka api-swoole, kode bisnis utama ada di direktori aplikasi. Setiap namespace di dalamnya berhubungan dengan subdirektori. Namespace default proyek adalah App. Setelah proyek dibuat, direktori app berisi tiga subdirektori: Common, Contoh, dan Ext. dan Ext umumnya menempatkan alat, dll. Struktur direktorinya adalah sebagai berikut:
./
└── app
├── Example # 放置接口源代码,相当于控制器层
├── Common # 公共代码目录,
└── Ext# 放置工具等
Ketika proyek perlu menambahkan antarmuka baru, pertama-tama buat file hello.php
baru di direktori ./app/Example
dan edit kodenya dengan 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'),
],
];
}
}
Tentukan rute proyek dalam file perutean route/http.php
. Parameter pertama adalah alamat akses browser yang ditentukan. Paruh pertama dari parameter kedua @
adalah namespace lengkap @
dalam metode kelas.
return [
HttpRouter("/hello", "AppExampleHello@index"),
];
Jalankan perintah berikut di direktori root proyek untuk memulai dalam mode non-daemon.
php apiswoole.php
Secara default, ia mendengarkan HTTP lokal dan port websocket 9501. Informasi keluaran berikut muncul di cmd untuk menunjukkan bahwa proyek berhasil dimulai.
[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
Masukkan alamat perutean yang ditentukan di bilah alamat browser, dan alamat tersebut terdiri dari http://ip网址:端口/定义的路由
.
http://127.0.0.1:9501/hello
Data yang dikembalikan setelah permintaan berhasil dikembalikan dalam format json secara default, termasuk kode default, pesan, dan bidang data. Data dalam data adalah data yang dikembalikan dalam metode.
{
"code" : 200 ,
"msg" : " success " ,
"data" : {
"code" : 200 ,
"data" : {
"name" : " api-swoole " ,
"version" : " 1.0.2 "
}
},
"debug" : []
}
Karena dukungan HttpServer
untuk protokol HTTP
tidak lengkap, disarankan untuk menggunakannya hanya sebagai server aplikasi untuk menangani permintaan dinamis, dan untuk menambahkan Nginx
sebagai proxy di front end. (alamat referensi)
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;
}
}
Anda bisa mendapatkan IP
asli klien dengan membaca $request->header['x-real-ip']
Folder config default berisi tiga file: conf.php, db.php, dan events.php. conf.php menampung informasi konfigurasi proyek, termasuk http, tcp, udp, websocket, dan konfigurasi lainnya. db.php bertanggung jawab untuk mengonfigurasi koneksi MySQL dan Redis, dan events.php bertanggung jawab untuk mendefinisikan dan menyesuaikan pendaftaran dan pemantauan acara tertentu. Sekarang mendukung pendaftaran acara workerStart、open、close、task、finish
. Informasi konfigurasi dapat dibaca melalui DI()->config->get('conf.ws')
atau 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']
],//添加用户自定义的工作进程
];
Layanan ini telah terdaftar secara default di apiswoole.php
ketika proyek dimulai.
$di = DI();
$di->config = new Config("./config");
Misalnya, informasi konfigurasinya adalah conf.php, dan strukturnya adalah:
return [
'debug' => true,//调试模式
'tcp' => [
'host' => '0.0.0.0',
'port' => 9500,
'sockType' => SWOOLE_SOCK_TCP,
'events' => [
['receive', AppControllerTcpServe::class, 'onReceive'],
],
'settings' => [],
],
]
Anda dapat menggunakan DI()->config->get('conf.tcp')
untuk membaca file konfigurasi
DI()->config->get('conf.tcp') #返回数组
Mengembalikan struktur data array:
{
"host" : " 0.0.0.0 " ,
"port" : 9500 ,
"sockType" : 1 ,
"events" : [
[
" receive " ,
" App \ Controller \ TcpServe " ,
" onReceive "
]
],
"settings" : []
}
Antarmuka log ditentukan secara rinci sesuai dengan spesifikasi PSR. Log dicatat di direktori ./storage/log
, dan日期.log
dibuat setiap hari. Saat ini jenis logging berikut ini didukung:
Sistem logging menggunakan:
DI()->logger->debug("日志测试debug"); #开发调试类日记
DI()->logger->info("日志测试info"); #业务纪录类日记
DI()->logger->notice("日志测试notice");#系统提示类日记
DI()->logger->waring("日志测试waring");#系统致命类日记
DI()->logger->error("日志测试error"); #系统异常类日记
Log yang sesuai di direktori ./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
mewarisi dari HttpServer, sehingga semua API
dan item konfigurasi yang disediakan oleh HttpServer
dapat digunakan. Silakan merujuk ke bab HttpServer.
WebSocketServer
juga dapat berfungsi sebagai server HTTP
pada saat yang bersamaan.WebSocketServer
akan mengembalikan halaman kesalahan HTTP 400
setelah menerima permintaan HTTP
. Jika Anda hanya ingin mengimplementasikan server websocket, hapus ['request', SapiEvents::class, 'onRequest']
di konfigurasi ./config/conf.php
.
Opsi konfigurasi server HTTP/websocket ada di ./config/conf.php
. Untuk informasi konfigurasi spesifik, silakan lihat opsi konfigurasi dokumen 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,
],
],
];
File pembuatan rute untuk server HTTP terletak di ./route/http.php
. Deklarasikan aturan perutean tertentu. Parameter pertama adalah alamat akses browser yang ditentukan. Bagian pertama dari parameter kedua @
adalah namespace lengkap file. Bagian kedua dari @
adalah metode spesifik yang dipanggil di kelas.
return [
HttpRouter("/", "AppExampleApp@Index"),
HttpRouter("/hello", "AppExampleHello@index"),
HttpRouter("声明浏览器地址", "命名空间+类@类中的方法"),
];
Alamat URL lengkap terdiri dari http://ip网址:端口/定义的路由
.
Membangun rute dasar hanya memerlukan URI dan闭包
, yang menyediakan cara yang sangat sederhana untuk menentukan rute:
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'),
],
];
}),
];
Metode pengontrol yang sesuai memiliki dua parameter, $request
dan $reponse
, secara default. Untuk pengenalan lengkap objek Permintaan dan Respons, silakan lihat dokumentasi Swoole: HttpRequest, HttpResponse.
<?php
namespace AppController;
use SapiApi;
class Hello extends Api
{
public function index()
{
return [
'code' => 200,
'data' => 'hello world'
];
}
}
Aturan parameter antarmuka diimplementasikan dengan mewarisi kelas Api
, dan aturan definisi spesifik diimplementasikan melalui metode rule()
.
name
sesuai dengan nilai yang diteruskan oleh klienrequire
menunjukkan bahwa nilai diteruskan sebagai opsi, true
harus diteruskan, false
harus diteruskan.type
, mendukung int
, string
, float
, bool
, array
, file
source
diteruskan ke lokasi dan mendukung get
, post
, dan 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/')
],
];
}
}
File definisi rute server websocket terletak di ./route/websocket.php
. Deklarasikan aturan perutean tertentu. Parameter pertama adalah alamat akses browser yang ditentukan. Bagian pertama dari parameter kedua @
adalah namespace lengkap file. Bagian kedua dari @
adalah metode spesifik yang dipanggil di kelas.
return [
WsRouter("/", "AppExampleWebsocket@index"),
WsRouter("/login", "AppExampleWebsocket@login"),
];
Alamat URL lengkap terdiri dari ws://ip网址:端口
.
Metode pengontrol yang sesuai memiliki dua parameter $server
dan $msg
, secara default. Untuk pengenalan lengkap tentang objek $server
, silakan lihat dokumentasi Swoole: WebSocketServer. $msg
adalah informasi data yang dikirimkan oleh klien.
Informasi data yang dikirim oleh klien perlu dikirimkan dalam format json secara default dan harus berisi tiga bidang id, jalur, dan data.
id
adalah pengidentifikasi unik isi pesan.path
adalah alamat akses yang dideklarasikan oleh rute ./route/websocket.php
.data
adalah parameter pesan spesifik proyek, dan metode kontrol default adalah $msg
. {
"id" : " 918wsEMQDrj0RXxm " ,
"path" : " / " ,
"data" : {
"username" : " api-swoole "
}
}
Contoh bagian kode pengontrol:
<?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'),
]
];
}
}
Aturan parameter antarmuka diimplementasikan dengan mewarisi kelas Api
, dan aturan definisi spesifik diimplementasikan melalui metode rule()
.
name
sesuai dengan nilai yang diteruskan oleh klienrequire
menunjukkan bahwa nilai diteruskan sebagai opsi, true
harus diteruskan, false
harus diteruskan.type
type, mendukung 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'],
]
];
}
}
Kelas Api
memiliki fungsi kait bawaan userCheck
, dan semua pengontrol HTTP dapat mewarisi kelebihan beban kelas Api
. Misalnya, otentikasi pengguna dapat dilakukan.
Pertama tentukan deklarasi file 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 "";
}
}
Kemudian warisi HttpBase.php
untuk mengimplementasikan kelas yang berlebihan.
<?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']
]
];
}
}
Kelas Api
memiliki fungsi kait bawaan userWsCheck
, dan semua pengontrol websocket dapat mewarisi kelebihan beban kelas Api
. Misalnya, otentikasi pengguna dapat dilakukan.
Pertama tentukan deklarasi file 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 "";
}
}
Kemudian warisi WsBase.php
untuk mengimplementasikan kelas yang berlebihan.
<?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
dapat mendengarkan beberapa port, dan setiap port dapat diatur untuk menangani protokol yang berbeda. Misalnya, port 80 menangani protokol HTTP, port 9500 menangani protokol TCP, dan port 9502 menangani protokol UDP. Enkripsi transport SSL/TLS
juga dapat diaktifkan hanya untuk port tertentu. Lihat dokumentasi resmi Swoole (pemantauan multi-port)
Opsi konfigurasi server TCP menambahkan bidang tcp di ./config/conf.php
. Untuk informasi konfigurasi spesifik, silakan lihat konfigurasi TCP dokumen Swoole.
'tcp' => [
'host' => '0.0.0.0',
'port' => 9500,
'sockType' => SWOOLE_SOCK_TCP,
'events' => [
['receive', AppControllerTcpServe::class, 'onReceive'],//TCP服务器回调
],
'settings' => [],
],
Opsi konfigurasi server UDP menambahkan kolom udp di ./config/conf.php
. Untuk informasi konfigurasi spesifik, silakan lihat konfigurasi UDP dokumen Swoole.
'udp' => [
'host' => '0.0.0.0',
'port' => 9502,
'sockType' => SWOOLE_SOCK_UDP,
'events' => [
['packet', AppControllerUdpServe::class, 'onPacket'],//UDP服务器回调
],
'settings' => [],
],
Tim pengembangan Swoole menggunakan fungsi PHP asli Hook untuk mengimplementasikan klien coroutine. Dengan satu baris kode, kode IO sinkron asli dapat diubah menjadi IO asinkron yang dapat dijadwalkan oleh coroutine, yaitu coroutineisasi satu klik. Cluster kelas SwooleServer yang disediakan oleh Swoole
dibuat secara otomatis dan tidak perlu dilakukan secara manual. Silakan merujuk ke aktifkan_coroutine. Untuk konten spesifik, silakan merujuk ke situs web resmi Swoole untuk coroutineisasi sekali klik.
Basis data kerangka kerja memperkenalkan paket ekspansi pihak ketiga simple-swoole
-swoole.
Opsi konfigurasi server Redis ada di ./config/db.php
.
<?php
return [
'redis' => [
'host' => '192.168.0.105',//Redis服务器地址
'port' => 6379,//指定 Redis 监听端口
'auth' => '',//登录密码
'db_index' => 2,//指定数据库
'time_out' => 1,//
'size' => 64,//连接池数量
],
];
Menggunakan Redis dalam proyek ini
<?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'],
],
];
}
}
Opsi konfigurasi server MySQL ada di ./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
mengonfigurasi kumpulan koneksi:
<?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
mengintegrasikan kerangka database PHP ringan Medoo. Anda perlu mewarisi SimpsDBBaseModel
saat menggunakannya, jadi metode penggunaannya pada dasarnya sama dengan Medoo. Silakan periksa dokumentasi Medoo untuk detailnya.
Satu-satunya perbedaan adalah operasi terkait transaksi. Di Medoo, metode action( $callback )
digunakan, tetapi dalam kerangka ini, metode action( $callback )
juga dapat digunakan
beginTransaction(); // 开启事务
commit(); // 提交事务
rollBack(); // 回滚事务
Contoh transaksi
$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();
}
Digunakan dalam proyek, struktur tabel database:
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,
],
];
}
}
Tambahkan proses pekerja yang ditentukan pengguna. Fungsi ini biasanya digunakan untuk membuat proses pekerja khusus untuk pemantauan, pelaporan atau tugas khusus lainnya. Untuk konten spesifik, silakan merujuk ke situs web resmi Swoole addProcess
Hal yang perlu diperhatikan:
$server
, seperti getClientList/getClientInfo/stats
Worker/Task
, Anda dapat memanggil metode yang disediakan oleh $process
untuk berkomunikasi dengan proses anak.$server->sendMessage
untuk berkomunikasi dengan proses Worker/Task
.Server->task/taskwait
tidak dapat digunakan dalam proses pengguna.Server->send/close
while(true)
(seperti yang ditunjukkan pada contoh di bawah) atau EventLoop (seperti membuat pengatur waktu), jika tidak, proses pengguna akan terus keluar dan memulai ulang.Contoh penggunaan
Tambahkan proses pekerja yang ditentukan pengguna dan tambahkan konfigurasi process
di ./config/conf.php
sebagai berikut:
'process' => [
[AppControllerProcess::class, 'addProcess']
],
Contoh pengontrol:
<?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);
}
}
Kerangka kerja ini secara default telah mendaftarkan lima peristiwa yang disesuaikan: workerStart、open、close、task、finish
. Kode bisnis pemrosesan dapat ditambahkan ke panggilan balik acara yang sesuai sesuai dengan karakteristik bisnis tertentu. ./confg/events.php
, setiap acara memungkinkan beberapa panggilan balik
<?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'],
],
];