本文總結(jié)了Swoole 4.x服務(wù)器預(yù)定義常量、Server配置選項(xiàng)、Server函數(shù)列表、Server屬性列表、事件回調(diào)函數(shù)" />

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Swoole 4.x服務(wù)器Server配置和函數(shù)列表

 更新時(shí)間:2024年11月16日 09:33:16   作者:王志強(qiáng)  
Swoole是一個(gè)使用C++語(yǔ)言編寫(xiě)的基于異步事件驅(qū)動(dòng)和協(xié)程的并行網(wǎng)絡(luò)通信引擎,為PHP提供協(xié)程、高性能網(wǎng)絡(luò)編程支持,使用同步風(fēng)格實(shí)現(xiàn)異步程序
本文總結(jié)了Swoole 4.x服務(wù)器預(yù)定義常量、Server配置選項(xiàng)、Server函數(shù)列表、Server屬性列表、事件回調(diào)函數(shù)

簡(jiǎn)介

Swoole 是一個(gè)使用 C++ 語(yǔ)言編寫(xiě)的基于異步事件驅(qū)動(dòng)和協(xié)程的并行網(wǎng)絡(luò)通信引擎,為 PHP 提供協(xié)程、高性能網(wǎng)絡(luò)編程支持。提供了多種通信協(xié)議的網(wǎng)絡(luò)服務(wù)器和客戶(hù)端模塊,可以方便快速的實(shí)現(xiàn) TCP/UDP服務(wù)、高性能Web、WebSocket服務(wù)、物聯(lián)網(wǎng)、實(shí)時(shí)通訊、游戲、微服務(wù)等,使 PHP 不再局限于傳統(tǒng)的 Web 領(lǐng)域。

PHP的異步、并行、高性能網(wǎng)絡(luò)通信引擎,使用純C語(yǔ)言編寫(xiě),提供了多種通信協(xié)議的異步IO服務(wù)器和客戶(hù)端。Swoole4 支持了完整的 Coroutine + Channel CSP 編程模式 ,可以使用同步風(fēng)格實(shí)現(xiàn)異步程序。

預(yù)定義常量

// 預(yù)定義常量
SWOOLE_VERSION 當(dāng)前Swoole的版本號(hào),字符串類(lèi)型,如1.6.0

// swoole_server構(gòu)造函數(shù)參數(shù)
SWOOLE_BASE 使用Base模式,業(yè)務(wù)代碼在Reactor進(jìn)程中直接執(zhí)行
SWOOLE_PROCESS 使用進(jìn)程模式,業(yè)務(wù)代碼在Worker進(jìn)程中執(zhí)行

// swoole_client構(gòu)造函數(shù)參數(shù)
SWOOLE_SOCK_TCP 創(chuàng)建tcp socket
SWOOLE_SOCK_TCP6 創(chuàng)建tcp ipv6 socket
SWOOLE_SOCK_UDP 創(chuàng)建udp socket
SWOOLE_SOCK_UDP6 創(chuàng)建udp ipv6 socket
SWOOLE_SOCK_SYNC 同步客戶(hù)端
SWOOLE_SOCK_ASYNC 異步客戶(hù)端

// swoole_lock構(gòu)造函數(shù)參數(shù)
SWOOLE_FILELOCK 創(chuàng)建文件鎖
SWOOLE_MUTEX 創(chuàng)建互斥鎖
SWOOLE_RWLOCK 創(chuàng)建讀寫(xiě)鎖
SWOOLE_SPINLOCK 創(chuàng)建自旋鎖
SWOOLE_SEM 創(chuàng)建信號(hào)量

// SSL加密方法
SWOOLE_SSLv3_SERVER_METHOD;
SWOOLE_SSLv3_METHOD;
SWOOLE_SSLv3_CLIENT_METHOD;
SWOOLE_SSLv23_METHOD 默認(rèn)加密方法;
SWOOLE_SSLv23_SERVER_METHOD;
SWOOLE_SSLv23_CLIENT_METHOD;
SWOOLE_TLSv1_METHOD;
SWOOLE_TLSv1_SERVER_METHOD;
SWOOLE_TLSv1_CLIENT_METHOD;
SWOOLE_TLSv1_1_METHOD;
SWOOLE_TLSv1_1_SERVER_METHOD;
SWOOLE_TLSv1_1_CLIENT_METHOD;
SWOOLE_TLSv1_2_METHOD;
SWOOLE_TLSv1_2_SERVER_METHOD;
SWOOLE_TLSv1_2_CLIENT_METHOD;
SWOOLE_DTLSv1_METHOD;
SWOOLE_DTLSv1_SERVER_METHOD;
SWOOLE_DTLSv1_CLIENT_METHOD;

 

Server 配置選項(xiàng)

$serv->set(array(
// 通過(guò)此參數(shù)來(lái)調(diào)節(jié)主進(jìn)程內(nèi)事件處理線(xiàn)程的數(shù)量,以充分利用多核。默認(rèn)會(huì)啟用CPU核數(shù)相同的數(shù)量。一般設(shè)置為CPU核數(shù)的1-4倍
 'reactor_num' => 2,

// 設(shè)置啟動(dòng)的Worker進(jìn)程數(shù)。業(yè)務(wù)代碼是全異步非阻塞的,這里設(shè)置為CPU的1-4倍最合理
 // 業(yè)務(wù)代碼為同步阻塞,需要根據(jù)請(qǐng)求響應(yīng)時(shí)間和系統(tǒng)負(fù)載來(lái)調(diào)整
 'worker_num' => 2,

// 設(shè)置worker進(jìn)程的最大任務(wù)數(shù),默認(rèn)為0,一個(gè)worker進(jìn)程在處理完超過(guò)此數(shù)值的任務(wù)后將自動(dòng)退出,進(jìn)程退出后會(huì)釋放所有內(nèi)存和資源。
 'max_request' => 1000,

// 服務(wù)器程序,最大允許的連接數(shù), 此參數(shù)用來(lái)設(shè)置Server最大允許維持多少個(gè)TCP連接。超過(guò)此數(shù)量后,新進(jìn)入的連接將被拒絕
 'max_connection' => 10000,

// 配置Task進(jìn)程的數(shù)量,配置此參數(shù)后將會(huì)啟用task功能。所以Server務(wù)必要注冊(cè)onTask
 'task_worker_num' => 2,

// 設(shè)置Task進(jìn)程與Worker進(jìn)程之間通信的方式。1使用unix socket通信,默認(rèn)模式, 2使用消息隊(duì)列通信, 3使用消息隊(duì)列通信,并設(shè)置為爭(zhēng)搶模式
 'task_ipc_mode' => 1

// 設(shè)置task進(jìn)程的最大任務(wù)數(shù)。一個(gè)task進(jìn)程在處理完超過(guò)此數(shù)值的任務(wù)后將自動(dòng)退出。
 'task_max_request'         => 0,

// 設(shè)置task的數(shù)據(jù)臨時(shí)目錄,在swoole_server中,如果投遞的數(shù)據(jù)超過(guò)8192字節(jié),將啟用臨時(shí)文件來(lái)保存數(shù)據(jù)
 'task_tmpdir'              => '/tmp',

// 數(shù)據(jù)包分發(fā)策略默認(rèn)為2。1輪循模式,2固定模式,3搶占模式,4IP分配,5UID分配
 'dispatch_mode'            => 2,

// 設(shè)置dispatch函數(shù),swoole底層了內(nèi)置了5種dispatch_mode,如果仍然無(wú)法滿(mǎn)足需求。
 // 可以使用編寫(xiě)C++函數(shù)或PHP函數(shù),實(shí)現(xiàn)dispatch邏輯。使用方法:
 'dispatch_func' => 'my_dispatch_function',

// 設(shè)置消息隊(duì)列的KEY,僅在task_ipc_mode = 2/3時(shí)使用。
 // 設(shè)置的Key僅作為T(mén)ask任務(wù)隊(duì)列的KEY,此參數(shù)的默認(rèn)值為ftok($php_script_file, 1)
 'message_queue_key'        => ftok(SYS_ROOT . 'queue.msg', 1),

//  設(shè)置守護(hù)進(jìn)程模式
 'daemonize'                => 1,

// Listen隊(duì)列長(zhǎng)度,如backlog => 128,此參數(shù)將決定最多同時(shí)有多少個(gè)等待accept的連接
 'backlog'                  => 128,

// 指定swoole錯(cuò)誤日志文件。在swoole運(yùn)行期發(fā)生的異常信息會(huì)記錄到這個(gè)文件中。默認(rèn)會(huì)打印到屏幕
 'log_file'                 => '/data/logs/swoole.log',

// 設(shè)置swoole_server錯(cuò)誤日志打印的等級(jí),范圍是0-5。低于log_level設(shè)置的日志信息不會(huì)拋出
 'log_level' => 1,

// 啟用心跳檢測(cè),此選項(xiàng)表示每隔多久輪循一次,單位為秒
 'heartbeat_check_interval' => 10,

// 與heartbeat_check_interval配合使用。表示連接最大允許空閑的時(shí)間
 'heartbeat_idle_time'      => 20,

// 打開(kāi)EOF檢測(cè),此選項(xiàng)將檢測(cè)客戶(hù)端連接發(fā)來(lái)的數(shù)據(jù),當(dāng)數(shù)據(jù)包結(jié)尾是指定的字符串時(shí)才會(huì)投遞給Worker進(jìn)程
 // 否則會(huì)一直拼接數(shù)據(jù)包,直到超過(guò)緩存區(qū)或者超時(shí)才會(huì)中止。當(dāng)出錯(cuò)時(shí)底層會(huì)認(rèn)為是惡意連接,丟棄數(shù)據(jù)并強(qiáng)制關(guān)閉連接
 'open_eof_check' => true,

// 啟用EOF自動(dòng)分包。當(dāng)設(shè)置open_eof_check后,底層檢測(cè)數(shù)據(jù)是否以特定的字符串結(jié)尾來(lái)進(jìn)行數(shù)據(jù)緩沖
 'open_eof_split' => true,

// 與 open_eof_check 或者 open_eof_split 配合使用,設(shè)置EOF字符串。
 'package_eof'              => "\r\r\n",

// 打開(kāi)包長(zhǎng)檢測(cè)特性。包長(zhǎng)檢測(cè)提供了固定包頭+包體這種格式協(xié)議的解析。
 // 啟用后,可以保證Worker進(jìn)程onReceive每次都會(huì)收到一個(gè)完整的數(shù)據(jù)包。
 'open_length_check' => true,

// 長(zhǎng)度值的類(lèi)型,接受一個(gè)字符參數(shù),與php的 pack 函數(shù)一致。
 'package_length_type'   => 'N',

// 設(shè)置長(zhǎng)度解析函數(shù),支持C++或PHP的2種類(lèi)型的函數(shù)。長(zhǎng)度函數(shù)必須返回一個(gè)整數(shù)
 'package_length_func' => 'package_length_func_name'

// 設(shè)置最大數(shù)據(jù)包尺寸,單位為字節(jié)
 'package_max_length' => 2000000,

// 啟用CPU親和性設(shè)置
 'open_cpu_affinity'        => 1,

// cpu_affinity_ignore 設(shè)置將此CPU空出,專(zhuān)門(mén)用于處理網(wǎng)絡(luò)中斷
 'cpu_affinity_ignore' => [0,1],

// 啟用open_tcp_nodelay,開(kāi)啟后TCP連接發(fā)送數(shù)據(jù)時(shí)會(huì)關(guān)閉Nagle合并算法,立即發(fā)往客戶(hù)端連接
 'open_tcp_nodelay' => 1,

// 啟用tcp_defer_accept特性,可以設(shè)置為一個(gè)數(shù)值,表示當(dāng)一個(gè)TCP連接有數(shù)據(jù)發(fā)送時(shí)才觸發(fā)accept
 'tcp_defer_accept' => 5

// 設(shè)置SSL隧道加密,設(shè)置值為一個(gè)文件名字符串,制定cert證書(shū)和key私鑰的路徑
 'ssl_cert_file' => __DIR__.'/config/ssl.crt',
'ssl_key_file' => __DIR__.'/config/ssl.key',

// 設(shè)置OpenSSL隧道加密的算法。Server與Client使用的算法必須一致,否則SSL/TLS握手會(huì)失敗,連接會(huì)被切斷
 'ssl_method' => SWOOLE_SSLv3_CLIENT_METHOD,

// 啟用SSL后,設(shè)置ssl_ciphers來(lái)改變openssl默認(rèn)的加密算法
 'ssl_ciphers' => 'ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP',

// 設(shè)置worker/task子進(jìn)程的所屬用戶(hù)
 'user' => 'swoole',

// 設(shè)置worker/task子進(jìn)程的進(jìn)程用戶(hù)組
 'group' => 'www-data',

// 重定向Worker進(jìn)程的文件系統(tǒng)根目錄
 'chroot' => '/data/server/',

// 在Server啟動(dòng)時(shí)自動(dòng)將master進(jìn)程的PID寫(xiě)入到文件,在Server關(guān)閉時(shí)自動(dòng)刪除PID文件
 'pid_file' => __DIR__.'/server.pid',

// 調(diào)整管道通信的內(nèi)存緩存區(qū)長(zhǎng)度。Swoole使用Unix Socket實(shí)現(xiàn)進(jìn)程間通信。
 'pipe_buffer_size' => 32 * 1024 *1024,

// 配置發(fā)送輸出緩存區(qū)內(nèi)存尺寸
 'buffer_output_size' => 32 * 1024 *1024

// 配置客戶(hù)端連接的緩存區(qū)長(zhǎng)度
 'socket_buffer_size' => 128 * 1024 *1024

// swoole在配置dispatch_mode=1或3后,因?yàn)橄到y(tǒng)無(wú)法保證onConnect/onReceive/onClose的順序,默認(rèn)關(guān)閉了onConnect/onClose事件。
 // 如果應(yīng)用程序需要onConnect/onClose事件,并且能接受順序問(wèn)題可能帶來(lái)的安全風(fēng)險(xiǎn),
 // 可以通過(guò)設(shè)置enable_unsafe_event為true,啟用onConnect/onClose事件
 'enable_unsafe_event' => true,


// swoole在配置dispatch_mode=1或3后,系統(tǒng)無(wú)法保證onConnect/onReceive/onClose的順序,因此可能會(huì)有一些請(qǐng)求數(shù)據(jù)在連接關(guān)閉后,
 // 才能到達(dá)Worker進(jìn)程。discard_timeout_request配置默認(rèn)為true,表示如果worker進(jìn)程收到了已關(guān)閉連接的數(shù)據(jù)請(qǐng)求,將自動(dòng)丟棄。
 // discard_timeout_request如果設(shè)置為false,表示無(wú)論連接是否關(guān)閉Worker進(jìn)程都會(huì)處理數(shù)據(jù)請(qǐng)求。
 'discard_timeout_request' => true,

// 設(shè)置端口重用
 'enable_reuse_port' => true,

// 設(shè)置此選項(xiàng)為true后,accept客戶(hù)端連接后將不會(huì)自動(dòng)加入EventLoop,僅觸發(fā)onConnect回調(diào)。
 // worker進(jìn)程可以調(diào)用$serv->confirm($fd)對(duì)連接進(jìn)行確認(rèn),此時(shí)才會(huì)將fd加入EventLoop開(kāi)始進(jìn)行數(shù)據(jù)收發(fā),
 // 也可以調(diào)用$serv->close($fd)關(guān)閉此連接。
 'enable_delay_receive' => true,

// 啟用Http協(xié)議處理
 'open_http_protocol' => true,

// 啟用HTTP2協(xié)議解析,需要依賴(lài)--enable-http2編譯選項(xiàng)。默認(rèn)為false
 'open_http2_protocol' => true,

// 啟用websocket協(xié)議處理,Swoole\WebSocket\Server會(huì)自動(dòng)啟用此選項(xiàng)
 'open_websocket_protocol' => true,

// 啟用mqtt協(xié)議處理,啟用后會(huì)解析mqtt包頭,worker進(jìn)程onReceive每次會(huì)返回一個(gè)完整的mqtt數(shù)據(jù)包
 'open_mqtt_protocol' => true,

// 設(shè)置異步重啟開(kāi)關(guān)
 'reload_async' => true,

// 開(kāi)啟TCP快速握手特性。此項(xiàng)特性,可以提升TCP短連接的響應(yīng)速度,在客戶(hù)端完成握手的第三步,發(fā)送SYN包時(shí)攜帶數(shù)據(jù)
 'tcp_fastopen' => true

// 開(kāi)啟請(qǐng)求慢日志。啟用后Manager進(jìn)程會(huì)設(shè)置一個(gè)時(shí)鐘信號(hào),定時(shí)偵測(cè)所有Task和Worker進(jìn)程,
 // 一旦進(jìn)程阻塞導(dǎo)致請(qǐng)求超過(guò)規(guī)定的時(shí)間,將自動(dòng)打印進(jìn)程的PHP函數(shù)調(diào)用棧
 'request_slowlog_file' => '/tmp/trace.log',

// enable_coroutine參數(shù),默認(rèn)為true,通過(guò)設(shè)置為false可關(guān)閉內(nèi)置協(xié)程
 'enable_coroutine' => false

// 設(shè)置當(dāng)前工作進(jìn)程最大協(xié)程數(shù)量,超過(guò)max_coroutine底層將無(wú)法創(chuàng)建新的協(xié)程,底層會(huì)拋出錯(cuò)誤,并直接關(guān)閉連接
 'max_coroutine' => 3000,
));

Server 函數(shù)列表

// 創(chuàng)建一個(gè)異步Server對(duì)象。
$serv = new swoole_server('0.0.0.0', '9501', $mode = SWOOLE_PROCESS, $sock_type = SWOOLE_SOCK_TCP);

// swoole_server->set函數(shù)用于設(shè)置swoole_server運(yùn)行時(shí)的各項(xiàng)參數(shù)。
 // 服務(wù)器啟動(dòng)后通過(guò)$serv->setting來(lái)訪(fǎng)問(wèn)set函數(shù)設(shè)置的參數(shù)數(shù)組。
$serv->set(array(
    'reactor_num' => 2,
    'worker_num' => 4,
    'backlog' => 128,
    'max_request' => 50,
    'dispatch_mode' => 1,
));

// 注冊(cè)Server的事件回調(diào)函數(shù)。
$serv->on('connect', function ($serv, $fd){
    echo "Client:Connect.\n";
});

// 增加監(jiān)聽(tīng)的端口。業(yè)務(wù)代碼中可以通過(guò)調(diào)用swoole_server::connection_info來(lái)獲取某個(gè)連接來(lái)自于哪個(gè)端口。
$serv->addlistener("127.0.0.1", 9502, SWOOLE_SOCK_TCP);
// 監(jiān)聽(tīng)一個(gè)新的Server端口,此方法是addlistener的別名
$serv->listen("127.0.0.1", 9503, SWOOLE_SOCK_TCP);

// 添加一個(gè)用戶(hù)自定義的工作進(jìn)程。此函數(shù)通常用于創(chuàng)建一個(gè)特殊的工作進(jìn)程,用于監(jiān)控、上報(bào)或者其他特殊的任務(wù)。
$process = new swoole_process(function($process) use ($server) {
    while (true) {
        $msg = $process->read();
        foreach($server->connections as $conn) {
            $server->send($conn, $msg);
        }
    }
});
$server->addProcess($process);

// 啟動(dòng)server,監(jiān)聽(tīng)所有TCP/UDP端口
$serv->start();

// 重啟所有worker進(jìn)程。$only_reload_taskworkrer 是否僅重啟task進(jìn)程
$serv->reload($only_reload_taskworkrer = false);

// 使當(dāng)前worker進(jìn)程停止運(yùn)行,并立即觸發(fā)onWorkerStop回調(diào)函數(shù)。
swoole_server->stop(int $worker_id = -1, bool $waitEvent = false);

// 此函數(shù)可以用在worker進(jìn)程內(nèi)。向主進(jìn)程發(fā)送SIGTERM也可以實(shí)現(xiàn)關(guān)閉服務(wù)器。
$serv->shutdown();

// tick定時(shí)器,可以自定義回調(diào)函數(shù)。此函數(shù)是swoole_timer_tick的別名。
$serv->tick(1000, function ($id) {
    var_dump($id);
});

// 在指定的時(shí)間后執(zhí)行函數(shù),swoole_server::after函數(shù)是一個(gè)一次性定時(shí)器,執(zhí)行完成后就會(huì)銷(xiāo)毀
$serv->after(2000, function(){
    echo "Timeout: ".microtime(true)."\n";
});

// 延后執(zhí)行一個(gè)PHP函數(shù)。Swoole底層會(huì)在EventLoop循環(huán)完成后執(zhí)行此函數(shù)。
 // 此函數(shù)的目的是為了讓一些PHP代碼延后執(zhí)行,程序優(yōu)先處理IO事件。
$server->defer(function() use ($db) {
    $db->close();
});

// 清除tick/after定時(shí)器,此函數(shù)是 swoole_timer_clear 的別名。
$timer_id = $server->tick(1000, function ($id) use ($server) {
    $server->clearTimer($id);
});

// 關(guān)閉客戶(hù)端連接,操作成功返回true,失敗返回false.
$serv->close($fd);

// 向客戶(hù)端發(fā)送數(shù)據(jù) $data,發(fā)送的數(shù)據(jù),TCP協(xié)議最大不得超過(guò)2M,可修改 buffer_output_size 改變?cè)试S發(fā)送的最大包長(zhǎng)度
 // UDP協(xié)議不得超過(guò)65507,UDP包頭占8字節(jié), IP包頭占20字節(jié),65535-28 = 65507
$serv->send($fd, 'Swoole: '.$data);

// 發(fā)送文件到TCP客戶(hù)端連接
$serv->sendfile($fd, __DIR__.'/test.jpg');

// 向任意的客戶(hù)端IP:PORT發(fā)送UDP數(shù)據(jù)包
$serv->sendto("127.0.0.1", 9999, "hello world");

// 阻塞地向客戶(hù)端發(fā)送數(shù)據(jù)
server->sendwait($fd, "hello world");

// 此函數(shù)可以向任意worker進(jìn)程或者task進(jìn)程發(fā)送消息。在非主進(jìn)程和管理進(jìn)程中可調(diào)用。收到消息的進(jìn)程會(huì)觸發(fā)onPipeMessage事件
$serv->sendMessage("hello task process", $worker_id);

// 檢測(cè)fd對(duì)應(yīng)的連接是否存在,$fd對(duì)應(yīng)的TCP連接存在返回true,不存在返回false
$serv->exist($fd)

// 停止接收數(shù)據(jù)。調(diào)用此函數(shù)后會(huì)將連接從EventLoop中移除,不再接收客戶(hù)端數(shù)據(jù)
$serv->pause($fd)

// 恢復(fù)數(shù)據(jù)接收。與pause方法成對(duì)使用,調(diào)用此函數(shù)后會(huì)將連接重新加入到EventLoop中,繼續(xù)接收客戶(hù)端數(shù)據(jù)
$serv->resume(int $fd);

// swoole_server->getClientInfo函數(shù)用來(lái)獲取連接的信息,別名是swoole_server->connection_info
$fdinfo = $serv->connection_info($fd);

// 用來(lái)遍歷當(dāng)前Server所有的客戶(hù)端連接,方法是基于共享內(nèi)存的,不存在IOWait
 // 推薦使用 swoole_server::$connections 迭代器來(lái)遍歷連接,getClientList的別名是connection_list
$conn_list = $serv->getClientList($start_fd, 10);

// 將連接綁定一個(gè)用戶(hù)定義的UID,可以設(shè)置dispatch_mode=5設(shè)置以此值進(jìn)行hash固定分配。
 // 可以保證某一個(gè)UID的連接全部會(huì)分配到同一個(gè)Worker進(jìn)程。
$serv->bind($fd, $uid)

// 得到當(dāng)前Server的活動(dòng)TCP連接數(shù),啟動(dòng)時(shí)間,accpet/close的總次數(shù)等信息。
$serv_stats = $serv->stats();

// 投遞一個(gè)異步任務(wù)到task_worker池中。此函數(shù)是非阻塞的,執(zhí)行完畢會(huì)立即返回。Worker進(jìn)程可以繼續(xù)處理新的請(qǐng)求。
 // 使用Task功能,必須先設(shè)置 task_worker_num,并且必須設(shè)置Server的onTask和onFinish事件回調(diào)函數(shù)
$task_id = $serv->task("some data");

// taskwait與task方法作用相同,用于投遞一個(gè)異步的任務(wù)到task進(jìn)程池去執(zhí)行。
 // 與task不同的是taskwait是同步等待的,直到任務(wù)完成或者超時(shí)返回。
$serv->taskwait(['type' => 'array', 'value' => $data]);

// 并發(fā)執(zhí)行多個(gè)Task,$tasks 必須為數(shù)字索引數(shù)組,不支持關(guān)聯(lián)索引數(shù)組
$tasks[] = mt_rand(1000, 9999); 
// 任務(wù)1
$tasks[] = mt_rand(1000, 9999); 
// 任務(wù)2
var_dump($tasks);
// 等待所有Task結(jié)果返回,超時(shí)為10s
$results = $serv->taskWaitMulti($tasks, 10.0);

// 并發(fā)執(zhí)行Task并進(jìn)行協(xié)程調(diào)度
$result = $serv->taskCo($tasks, 0.5);

// 此函數(shù)用于在task進(jìn)程中通知worker進(jìn)程,投遞的任務(wù)已完成。此函數(shù)可以傳遞結(jié)果數(shù)據(jù)給worker進(jìn)程。
$serv->finish("response");

// 檢測(cè)服務(wù)器所有連接,并找出已經(jīng)超過(guò)約定時(shí)間的連接。
 // 如果指定if_close_connection,則自動(dòng)關(guān)閉超時(shí)的連接。未指定僅返回連接的fd數(shù)組。
$closeFdArr = $serv->heartbeat();

// 獲取最近一次操作錯(cuò)誤的錯(cuò)誤碼。業(yè)務(wù)代碼中可以根據(jù)錯(cuò)誤碼類(lèi)型執(zhí)行不同的邏輯。
$errCode = $serv->getLastError();

// 調(diào)用此方法可以得到底層的socket句柄,返回的對(duì)象為sockets資源句柄。
 // 依賴(lài)PHP的sockets擴(kuò)展,并且編譯swoole時(shí)需要開(kāi)啟--enable-sockets選項(xiàng)
$socket = $serv->getSocket();

// 設(shè)置客戶(hù)端連接為保護(hù)狀態(tài),不被心跳線(xiàn)程切斷。
$serv->protect(int $fd, bool $value = 1);

// 確認(rèn)連接,與enable_delay_receive或wait_for_bind配合使用。當(dāng)客戶(hù)端建立連接后,并不監(jiān)聽(tīng)可讀事件。
 // 僅觸發(fā)onConnect事件回調(diào)在onConnect回調(diào)中執(zhí)行confirm確認(rèn)連接,這時(shí)服務(wù)器才會(huì)監(jiān)聽(tīng)可讀事件,接收來(lái)自客戶(hù)端連接的數(shù)據(jù)。
$serv->confirm(int $fd);

Server 屬性列表

// swoole_server::set()函數(shù)所設(shè)置的參數(shù)會(huì)保存到swoole_server::$setting屬性上。在回調(diào)函數(shù)中可以訪(fǎng)問(wèn)運(yùn)行參數(shù)的值。
echo $serv->setting['worker_num'];

// 返回當(dāng)前服務(wù)器主進(jìn)程的PID。
 int $serv->master_pid;

// 返回當(dāng)前服務(wù)器管理進(jìn)程的PID。
 int $serv->manager_pid;

// 得到當(dāng)前Worker進(jìn)程的編號(hào),包括Task進(jìn)程。Worker進(jìn)程編號(hào)范圍是[0, worker_num]
 // Task進(jìn)程編號(hào)范圍是[worker_num, worker_num + task_worker_num]
 int $serv->worker_id;

// 得到當(dāng)前Worker進(jìn)程的操作系統(tǒng)進(jìn)程ID。與posix_getpid()的返回值相同。
 int $serv->worker_pid;

// 布爾類(lèi)型,true表示當(dāng)前的進(jìn)程是Task工作進(jìn)程,false表示當(dāng)前的進(jìn)程是Worker進(jìn)程
 bool $serv->taskworker;

// TCP連接迭代器,可以使用foreach遍歷服務(wù)器當(dāng)前所有的連接,
 // 此屬性的功能與swoole_server->connnection_list是一致的,但是更加友好。遍歷的元素為單個(gè)連接的fd。
 // 監(jiān)聽(tīng)端口數(shù)組,如果服務(wù)器監(jiān)聽(tīng)了多個(gè)端口可以遍歷swoole_server::$ports得到所有Swoole\Server\Port對(duì)象。
 // 其中swoole_server::$ports[0]為構(gòu)造方法所設(shè)置的主服務(wù)器端口。
$ports = swoole_server::$ports;
$ports[0]->set($settings);
$ports[1]->on("Receive", function(){});

事件回調(diào)函數(shù)

// Server啟動(dòng)在主進(jìn)程的主線(xiàn)程回調(diào)此函數(shù)
$serv->on('Start', function(Swoole\Server $server){});

// 此事件在Server正常結(jié)束時(shí)發(fā)生
$serv->on('Shutdown', function(Swoole\Server $server){});

// 此事件在Worker進(jìn)程/Task進(jìn)程啟動(dòng)時(shí)發(fā)生
$serv->on('WorkerStart', function(Swoole\Server $server, int $worker_id){});

// 此事件在worker進(jìn)程終止時(shí)發(fā)生
$serv->on('WorkerStop', function(Swoole\Server $server, int $worker_id){});

// 僅在開(kāi)啟reload_async特性后有效會(huì)先創(chuàng)建新的Worker進(jìn)程處理新請(qǐng)求,舊的Worker進(jìn)程自行退出。
$serv->on('WorkerExit', function(Swoole\Server $server, int $worker_id){});

// 有新的連接進(jìn)入時(shí),在worker進(jìn)程中回調(diào)
$serv->on('Connect', function(Swoole\Server $server, int $fd, int $reactorId){});

// 接收到數(shù)據(jù)時(shí)回調(diào)此函數(shù),發(fā)生在worker進(jìn)程中
$serv->on('Receive', function(Swoole\Server $server, int $fd, int $reactor_id, string $data){});

// 接收到UDP數(shù)據(jù)包時(shí)回調(diào)此函數(shù),發(fā)生在worker進(jìn)程中
$serv->on('Packet', function(Swoole\Server $server, string $data, array $client_info){});

// TCP客戶(hù)端連接關(guān)閉后,在worker進(jìn)程中回調(diào)此函數(shù)
$serv->on('Close', function(Swoole\Server $server, int $fd, int $reactorId){});

// 當(dāng)緩存區(qū)達(dá)到最高水位時(shí)觸發(fā)此事件。
$serv->on('BufferFull', function(Swoole\Server $serv, int $fd){});

// 當(dāng)緩存區(qū)低于最低水位線(xiàn)時(shí)觸發(fā)此事件
$serv->on('BufferEmpty', function(Swoole\Server $serv, int $fd){});

// 在task_worker進(jìn)程內(nèi)被調(diào)用。worker進(jìn)程可以使用swoole_server_task函數(shù)向task_worker進(jìn)程投遞新的任務(wù)。
 // 當(dāng)前的Task進(jìn)程在調(diào)用onTask回調(diào)函數(shù)時(shí)會(huì)將進(jìn)程狀態(tài)切換為忙碌,這時(shí)將不再接收新的Task,
 // 當(dāng)onTask函數(shù)返回時(shí)會(huì)將進(jìn)程狀態(tài)切換為空閑然后繼續(xù)接收新的Task。
$serv->on('Task', function(Swoole\Server $serv, int $task_id, int $src_worker_id, mixed $data){});

// 當(dāng)worker進(jìn)程投遞的任務(wù)在task_worker中完成時(shí),
 // task進(jìn)程會(huì)通過(guò)swoole_server->finish()方法將任務(wù)處理的結(jié)果發(fā)送給worker進(jìn)程
$serv->on('Finish', function(Swoole\Server $serv, int $task_id, string $data){});

// 當(dāng)工作進(jìn)程收到由 sendMessage 發(fā)送的管道消息時(shí)會(huì)觸發(fā)onPipeMessage事件。worker/task進(jìn)程都可能會(huì)觸發(fā)onPipeMessage事件
$serv->on('PipeMessage', function(Swoole\Server $server, int $src_worker_id, mixed $message){});

// 當(dāng)worker/task_worker進(jìn)程發(fā)生異常后會(huì)在Manager進(jìn)程內(nèi)回調(diào)此函數(shù)
$serv->on('WorkerError', function(Swoole\Server $serv, int $worker_id, int $worker_pid, int $exit_code, int $signal){});

// 當(dāng)管理進(jìn)程啟動(dòng)時(shí)調(diào)用它
$serv->on('ManagerStart', function(Swoole\Server $serv){});

// 當(dāng)管理進(jìn)程結(jié)束時(shí)調(diào)用它
$serv->on('ManagerStop', function(Swoole\Server $serv){});

相關(guān)文章

最新評(píng)論