Swoole 4.x服務(wù)器Server配置和函數(shù)列表
本文總結(jié)了Swoole 4.x服務(wù)器預(yù)定義常量、Server配置選項、Server函數(shù)列表、Server屬性列表、事件回調(diào)函數(shù)
簡介
Swoole 是一個使用 C++ 語言編寫的基于異步事件驅(qū)動和協(xié)程的并行網(wǎng)絡(luò)通信引擎,為 PHP 提供協(xié)程、高性能網(wǎng)絡(luò)編程支持。提供了多種通信協(xié)議的網(wǎng)絡(luò)服務(wù)器和客戶端模塊,可以方便快速的實現(xiàn) TCP/UDP服務(wù)、高性能Web、WebSocket服務(wù)、物聯(lián)網(wǎng)、實時通訊、游戲、微服務(wù)等,使 PHP 不再局限于傳統(tǒng)的 Web 領(lǐng)域。
PHP的異步、并行、高性能網(wǎng)絡(luò)通信引擎,使用純C語言編寫,提供了多種通信協(xié)議的異步IO服務(wù)器和客戶端。Swoole4 支持了完整的 Coroutine + Channel CSP 編程模式 ,可以使用同步風(fēng)格實現(xiàn)異步程序。
預(yù)定義常量
// 預(yù)定義常量 SWOOLE_VERSION 當(dāng)前Swoole的版本號,字符串類型,如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 同步客戶端 SWOOLE_SOCK_ASYNC 異步客戶端 // swoole_lock構(gòu)造函數(shù)參數(shù) SWOOLE_FILELOCK 創(chuàng)建文件鎖 SWOOLE_MUTEX 創(chuàng)建互斥鎖 SWOOLE_RWLOCK 創(chuàng)建讀寫鎖 SWOOLE_SPINLOCK 創(chuàng)建自旋鎖 SWOOLE_SEM 創(chuàng)建信號量 // 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 配置選項
$serv->set(array( // 通過此參數(shù)來調(diào)節(jié)主進(jìn)程內(nèi)事件處理線程的數(shù)量,以充分利用多核。默認(rèn)會啟用CPU核數(shù)相同的數(shù)量。一般設(shè)置為CPU核數(shù)的1-4倍 'reactor_num' => 2, // 設(shè)置啟動的Worker進(jìn)程數(shù)。業(yè)務(wù)代碼是全異步非阻塞的,這里設(shè)置為CPU的1-4倍最合理 // 業(yè)務(wù)代碼為同步阻塞,需要根據(jù)請求響應(yīng)時間和系統(tǒng)負(fù)載來調(diào)整 'worker_num' => 2, // 設(shè)置worker進(jìn)程的最大任務(wù)數(shù),默認(rèn)為0,一個worker進(jìn)程在處理完超過此數(shù)值的任務(wù)后將自動退出,進(jìn)程退出后會釋放所有內(nèi)存和資源。 'max_request' => 1000, // 服務(wù)器程序,最大允許的連接數(shù), 此參數(shù)用來設(shè)置Server最大允許維持多少個TCP連接。超過此數(shù)量后,新進(jìn)入的連接將被拒絕 'max_connection' => 10000, // 配置Task進(jìn)程的數(shù)量,配置此參數(shù)后將會啟用task功能。所以Server務(wù)必要注冊onTask 'task_worker_num' => 2, // 設(shè)置Task進(jìn)程與Worker進(jìn)程之間通信的方式。1使用unix socket通信,默認(rèn)模式, 2使用消息隊列通信, 3使用消息隊列通信,并設(shè)置為爭搶模式 'task_ipc_mode' => 1 // 設(shè)置task進(jìn)程的最大任務(wù)數(shù)。一個task進(jìn)程在處理完超過此數(shù)值的任務(wù)后將自動退出。 'task_max_request' => 0, // 設(shè)置task的數(shù)據(jù)臨時目錄,在swoole_server中,如果投遞的數(shù)據(jù)超過8192字節(jié),將啟用臨時文件來保存數(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,如果仍然無法滿足需求。 // 可以使用編寫C++函數(shù)或PHP函數(shù),實現(xiàn)dispatch邏輯。使用方法: 'dispatch_func' => 'my_dispatch_function', // 設(shè)置消息隊列的KEY,僅在task_ipc_mode = 2/3時使用。 // 設(shè)置的Key僅作為Task任務(wù)隊列的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隊列長度,如backlog => 128,此參數(shù)將決定最多同時有多少個等待accept的連接 'backlog' => 128, // 指定swoole錯誤日志文件。在swoole運行期發(fā)生的異常信息會記錄到這個文件中。默認(rèn)會打印到屏幕 'log_file' => '/data/logs/swoole.log', // 設(shè)置swoole_server錯誤日志打印的等級,范圍是0-5。低于log_level設(shè)置的日志信息不會拋出 'log_level' => 1, // 啟用心跳檢測,此選項表示每隔多久輪循一次,單位為秒 'heartbeat_check_interval' => 10, // 與heartbeat_check_interval配合使用。表示連接最大允許空閑的時間 'heartbeat_idle_time' => 20, // 打開EOF檢測,此選項將檢測客戶端連接發(fā)來的數(shù)據(jù),當(dāng)數(shù)據(jù)包結(jié)尾是指定的字符串時才會投遞給Worker進(jìn)程 // 否則會一直拼接數(shù)據(jù)包,直到超過緩存區(qū)或者超時才會中止。當(dāng)出錯時底層會認(rèn)為是惡意連接,丟棄數(shù)據(jù)并強(qiáng)制關(guān)閉連接 'open_eof_check' => true, // 啟用EOF自動分包。當(dāng)設(shè)置open_eof_check后,底層檢測數(shù)據(jù)是否以特定的字符串結(jié)尾來進(jìn)行數(shù)據(jù)緩沖 'open_eof_split' => true, // 與 open_eof_check 或者 open_eof_split 配合使用,設(shè)置EOF字符串。 'package_eof' => "\r\r\n", // 打開包長檢測特性。包長檢測提供了固定包頭+包體這種格式協(xié)議的解析。 // 啟用后,可以保證Worker進(jìn)程onReceive每次都會收到一個完整的數(shù)據(jù)包。 'open_length_check' => true, // 長度值的類型,接受一個字符參數(shù),與php的 pack 函數(shù)一致。 'package_length_type' => 'N', // 設(shè)置長度解析函數(shù),支持C++或PHP的2種類型的函數(shù)。長度函數(shù)必須返回一個整數(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空出,專門用于處理網(wǎng)絡(luò)中斷 'cpu_affinity_ignore' => [0,1], // 啟用open_tcp_nodelay,開啟后TCP連接發(fā)送數(shù)據(jù)時會關(guān)閉Nagle合并算法,立即發(fā)往客戶端連接 'open_tcp_nodelay' => 1, // 啟用tcp_defer_accept特性,可以設(shè)置為一個數(shù)值,表示當(dāng)一個TCP連接有數(shù)據(jù)發(fā)送時才觸發(fā)accept 'tcp_defer_accept' => 5 // 設(shè)置SSL隧道加密,設(shè)置值為一個文件名字符串,制定cert證書和key私鑰的路徑 'ssl_cert_file' => __DIR__.'/config/ssl.crt', 'ssl_key_file' => __DIR__.'/config/ssl.key', // 設(shè)置OpenSSL隧道加密的算法。Server與Client使用的算法必須一致,否則SSL/TLS握手會失敗,連接會被切斷 'ssl_method' => SWOOLE_SSLv3_CLIENT_METHOD, // 啟用SSL后,設(shè)置ssl_ciphers來改變openssl默認(rèn)的加密算法 'ssl_ciphers' => 'ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP', // 設(shè)置worker/task子進(jìn)程的所屬用戶 'user' => 'swoole', // 設(shè)置worker/task子進(jìn)程的進(jìn)程用戶組 'group' => 'www-data', // 重定向Worker進(jìn)程的文件系統(tǒng)根目錄 'chroot' => '/data/server/', // 在Server啟動時自動將master進(jìn)程的PID寫入到文件,在Server關(guān)閉時自動刪除PID文件 'pid_file' => __DIR__.'/server.pid', // 調(diào)整管道通信的內(nèi)存緩存區(qū)長度。Swoole使用Unix Socket實現(xiàn)進(jìn)程間通信。 'pipe_buffer_size' => 32 * 1024 *1024, // 配置發(fā)送輸出緩存區(qū)內(nèi)存尺寸 'buffer_output_size' => 32 * 1024 *1024 // 配置客戶端連接的緩存區(qū)長度 'socket_buffer_size' => 128 * 1024 *1024 // swoole在配置dispatch_mode=1或3后,因為系統(tǒng)無法保證onConnect/onReceive/onClose的順序,默認(rèn)關(guān)閉了onConnect/onClose事件。 // 如果應(yīng)用程序需要onConnect/onClose事件,并且能接受順序問題可能帶來的安全風(fēng)險, // 可以通過設(shè)置enable_unsafe_event為true,啟用onConnect/onClose事件 'enable_unsafe_event' => true, // swoole在配置dispatch_mode=1或3后,系統(tǒng)無法保證onConnect/onReceive/onClose的順序,因此可能會有一些請求數(shù)據(jù)在連接關(guān)閉后, // 才能到達(dá)Worker進(jìn)程。discard_timeout_request配置默認(rèn)為true,表示如果worker進(jìn)程收到了已關(guān)閉連接的數(shù)據(jù)請求,將自動丟棄。 // discard_timeout_request如果設(shè)置為false,表示無論連接是否關(guān)閉Worker進(jìn)程都會處理數(shù)據(jù)請求。 'discard_timeout_request' => true, // 設(shè)置端口重用 'enable_reuse_port' => true, // 設(shè)置此選項為true后,accept客戶端連接后將不會自動加入EventLoop,僅觸發(fā)onConnect回調(diào)。 // worker進(jìn)程可以調(diào)用$serv->confirm($fd)對連接進(jìn)行確認(rèn),此時才會將fd加入EventLoop開始進(jìn)行數(shù)據(jù)收發(fā), // 也可以調(diào)用$serv->close($fd)關(guān)閉此連接。 'enable_delay_receive' => true, // 啟用Http協(xié)議處理 'open_http_protocol' => true, // 啟用HTTP2協(xié)議解析,需要依賴--enable-http2編譯選項。默認(rèn)為false 'open_http2_protocol' => true, // 啟用websocket協(xié)議處理,Swoole\WebSocket\Server會自動啟用此選項 'open_websocket_protocol' => true, // 啟用mqtt協(xié)議處理,啟用后會解析mqtt包頭,worker進(jìn)程onReceive每次會返回一個完整的mqtt數(shù)據(jù)包 'open_mqtt_protocol' => true, // 設(shè)置異步重啟開關(guān) 'reload_async' => true, // 開啟TCP快速握手特性。此項特性,可以提升TCP短連接的響應(yīng)速度,在客戶端完成握手的第三步,發(fā)送SYN包時攜帶數(shù)據(jù) 'tcp_fastopen' => true // 開啟請求慢日志。啟用后Manager進(jìn)程會設(shè)置一個時鐘信號,定時偵測所有Task和Worker進(jìn)程, // 一旦進(jìn)程阻塞導(dǎo)致請求超過規(guī)定的時間,將自動打印進(jìn)程的PHP函數(shù)調(diào)用棧 'request_slowlog_file' => '/tmp/trace.log', // enable_coroutine參數(shù),默認(rèn)為true,通過設(shè)置為false可關(guān)閉內(nèi)置協(xié)程 'enable_coroutine' => false // 設(shè)置當(dāng)前工作進(jìn)程最大協(xié)程數(shù)量,超過max_coroutine底層將無法創(chuàng)建新的協(xié)程,底層會拋出錯誤,并直接關(guān)閉連接 'max_coroutine' => 3000, ));
Server 函數(shù)列表
// 創(chuàng)建一個異步Server對象。
$serv = new swoole_server('0.0.0.0', '9501', $mode = SWOOLE_PROCESS, $sock_type = SWOOLE_SOCK_TCP);
// swoole_server->set函數(shù)用于設(shè)置swoole_server運行時的各項參數(shù)。
// 服務(wù)器啟動后通過$serv->setting來訪問set函數(shù)設(shè)置的參數(shù)數(shù)組。
$serv->set(array(
'reactor_num' => 2,
'worker_num' => 4,
'backlog' => 128,
'max_request' => 50,
'dispatch_mode' => 1,
));
// 注冊Server的事件回調(diào)函數(shù)。
$serv->on('connect', function ($serv, $fd){
echo "Client:Connect.\n";
});
// 增加監(jiān)聽的端口。業(yè)務(wù)代碼中可以通過調(diào)用swoole_server::connection_info來獲取某個連接來自于哪個端口。
$serv->addlistener("127.0.0.1", 9502, SWOOLE_SOCK_TCP);
// 監(jiān)聽一個新的Server端口,此方法是addlistener的別名
$serv->listen("127.0.0.1", 9503, SWOOLE_SOCK_TCP);
// 添加一個用戶自定義的工作進(jìn)程。此函數(shù)通常用于創(chuàng)建一個特殊的工作進(jìn)程,用于監(jiān)控、上報或者其他特殊的任務(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);
// 啟動server,監(jiān)聽所有TCP/UDP端口
$serv->start();
// 重啟所有worker進(jìn)程。$only_reload_taskworkrer 是否僅重啟task進(jìn)程
$serv->reload($only_reload_taskworkrer = false);
// 使當(dāng)前worker進(jì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也可以實現(xiàn)關(guān)閉服務(wù)器。
$serv->shutdown();
// tick定時器,可以自定義回調(diào)函數(shù)。此函數(shù)是swoole_timer_tick的別名。
$serv->tick(1000, function ($id) {
var_dump($id);
});
// 在指定的時間后執(zhí)行函數(shù),swoole_server::after函數(shù)是一個一次性定時器,執(zhí)行完成后就會銷毀
$serv->after(2000, function(){
echo "Timeout: ".microtime(true)."\n";
});
// 延后執(zhí)行一個PHP函數(shù)。Swoole底層會在EventLoop循環(huán)完成后執(zhí)行此函數(shù)。
// 此函數(shù)的目的是為了讓一些PHP代碼延后執(zhí)行,程序優(yōu)先處理IO事件。
$server->defer(function() use ($db) {
$db->close();
});
// 清除tick/after定時器,此函數(shù)是 swoole_timer_clear 的別名。
$timer_id = $server->tick(1000, function ($id) use ($server) {
$server->clearTimer($id);
});
// 關(guān)閉客戶端連接,操作成功返回true,失敗返回false.
$serv->close($fd);
// 向客戶端發(fā)送數(shù)據(jù) $data,發(fā)送的數(shù)據(jù),TCP協(xié)議最大不得超過2M,可修改 buffer_output_size 改變允許發(fā)送的最大包長度
// UDP協(xié)議不得超過65507,UDP包頭占8字節(jié), IP包頭占20字節(jié),65535-28 = 65507
$serv->send($fd, 'Swoole: '.$data);
// 發(fā)送文件到TCP客戶端連接
$serv->sendfile($fd, __DIR__.'/test.jpg');
// 向任意的客戶端IP:PORT發(fā)送UDP數(shù)據(jù)包
$serv->sendto("127.0.0.1", 9999, "hello world");
// 阻塞地向客戶端發(fā)送數(shù)據(jù)
server->sendwait($fd, "hello world");
// 此函數(shù)可以向任意worker進(jìn)程或者task進(jìn)程發(fā)送消息。在非主進(jìn)程和管理進(jìn)程中可調(diào)用。收到消息的進(jìn)程會觸發(fā)onPipeMessage事件
$serv->sendMessage("hello task process", $worker_id);
// 檢測fd對應(yīng)的連接是否存在,$fd對應(yīng)的TCP連接存在返回true,不存在返回false
$serv->exist($fd)
// 停止接收數(shù)據(jù)。調(diào)用此函數(shù)后會將連接從EventLoop中移除,不再接收客戶端數(shù)據(jù)
$serv->pause($fd)
// 恢復(fù)數(shù)據(jù)接收。與pause方法成對使用,調(diào)用此函數(shù)后會將連接重新加入到EventLoop中,繼續(xù)接收客戶端數(shù)據(jù)
$serv->resume(int $fd);
// swoole_server->getClientInfo函數(shù)用來獲取連接的信息,別名是swoole_server->connection_info
$fdinfo = $serv->connection_info($fd);
// 用來遍歷當(dāng)前Server所有的客戶端連接,方法是基于共享內(nèi)存的,不存在IOWait
// 推薦使用 swoole_server::$connections 迭代器來遍歷連接,getClientList的別名是connection_list
$conn_list = $serv->getClientList($start_fd, 10);
// 將連接綁定一個用戶定義的UID,可以設(shè)置dispatch_mode=5設(shè)置以此值進(jìn)行hash固定分配。
// 可以保證某一個UID的連接全部會分配到同一個Worker進(jìn)程。
$serv->bind($fd, $uid)
// 得到當(dāng)前Server的活動TCP連接數(shù),啟動時間,accpet/close的總次數(shù)等信息。
$serv_stats = $serv->stats();
// 投遞一個異步任務(wù)到task_worker池中。此函數(shù)是非阻塞的,執(zhí)行完畢會立即返回。Worker進(jìn)程可以繼續(xù)處理新的請求。
// 使用Task功能,必須先設(shè)置 task_worker_num,并且必須設(shè)置Server的onTask和onFinish事件回調(diào)函數(shù)
$task_id = $serv->task("some data");
// taskwait與task方法作用相同,用于投遞一個異步的任務(wù)到task進(jìn)程池去執(zhí)行。
// 與task不同的是taskwait是同步等待的,直到任務(wù)完成或者超時返回。
$serv->taskwait(['type' => 'array', 'value' => $data]);
// 并發(fā)執(zhí)行多個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é)果返回,超時為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");
// 檢測服務(wù)器所有連接,并找出已經(jīng)超過約定時間的連接。
// 如果指定if_close_connection,則自動關(guān)閉超時的連接。未指定僅返回連接的fd數(shù)組。
$closeFdArr = $serv->heartbeat();
// 獲取最近一次操作錯誤的錯誤碼。業(yè)務(wù)代碼中可以根據(jù)錯誤碼類型執(zhí)行不同的邏輯。
$errCode = $serv->getLastError();
// 調(diào)用此方法可以得到底層的socket句柄,返回的對象為sockets資源句柄。
// 依賴PHP的sockets擴(kuò)展,并且編譯swoole時需要開啟--enable-sockets選項
$socket = $serv->getSocket();
// 設(shè)置客戶端連接為保護(hù)狀態(tài),不被心跳線程切斷。
$serv->protect(int $fd, bool $value = 1);
// 確認(rèn)連接,與enable_delay_receive或wait_for_bind配合使用。當(dāng)客戶端建立連接后,并不監(jiān)聽可讀事件。
// 僅觸發(fā)onConnect事件回調(diào)在onConnect回調(diào)中執(zhí)行confirm確認(rèn)連接,這時服務(wù)器才會監(jiān)聽可讀事件,接收來自客戶端連接的數(shù)據(jù)。
$serv->confirm(int $fd);Server 屬性列表
// swoole_server::set()函數(shù)所設(shè)置的參數(shù)會保存到swoole_server::$setting屬性上。在回調(diào)函數(shù)中可以訪問運行參數(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)程的編號,包括Task進(jìn)程。Worker進(jìn)程編號范圍是[0, worker_num]
// Task進(jìn)程編號范圍是[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;
// 布爾類型,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是一致的,但是更加友好。遍歷的元素為單個連接的fd。
// 監(jiān)聽端口數(shù)組,如果服務(wù)器監(jiān)聽了多個端口可以遍歷swoole_server::$ports得到所有Swoole\Server\Port對象。
// 其中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啟動在主進(jìn)程的主線程回調(diào)此函數(shù)
$serv->on('Start', function(Swoole\Server $server){});
// 此事件在Server正常結(jié)束時發(fā)生
$serv->on('Shutdown', function(Swoole\Server $server){});
// 此事件在Worker進(jìn)程/Task進(jìn)程啟動時發(fā)生
$serv->on('WorkerStart', function(Swoole\Server $server, int $worker_id){});
// 此事件在worker進(jìn)程終止時發(fā)生
$serv->on('WorkerStop', function(Swoole\Server $server, int $worker_id){});
// 僅在開啟reload_async特性后有效會先創(chuàng)建新的Worker進(jìn)程處理新請求,舊的Worker進(jìn)程自行退出。
$serv->on('WorkerExit', function(Swoole\Server $server, int $worker_id){});
// 有新的連接進(jìn)入時,在worker進(jìn)程中回調(diào)
$serv->on('Connect', function(Swoole\Server $server, int $fd, int $reactorId){});
// 接收到數(shù)據(jù)時回調(diào)此函數(shù),發(fā)生在worker進(jìn)程中
$serv->on('Receive', function(Swoole\Server $server, int $fd, int $reactor_id, string $data){});
// 接收到UDP數(shù)據(jù)包時回調(diào)此函數(shù),發(fā)生在worker進(jìn)程中
$serv->on('Packet', function(Swoole\Server $server, string $data, array $client_info){});
// TCP客戶端連接關(guān)閉后,在worker進(jìn)程中回調(diào)此函數(shù)
$serv->on('Close', function(Swoole\Server $server, int $fd, int $reactorId){});
// 當(dāng)緩存區(qū)達(dá)到最高水位時觸發(fā)此事件。
$serv->on('BufferFull', function(Swoole\Server $serv, int $fd){});
// 當(dāng)緩存區(qū)低于最低水位線時觸發(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ù)時會將進(jìn)程狀態(tài)切換為忙碌,這時將不再接收新的Task,
// 當(dāng)onTask函數(shù)返回時會將進(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中完成時,
// task進(jìn)程會通過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ā)送的管道消息時會觸發(fā)onPipeMessage事件。worker/task進(jìn)程都可能會觸發(fā)onPipeMessage事件
$serv->on('PipeMessage', function(Swoole\Server $server, int $src_worker_id, mixed $message){});
// 當(dāng)worker/task_worker進(jìn)程發(fā)生異常后會在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)程啟動時調(diào)用它
$serv->on('ManagerStart', function(Swoole\Server $serv){});
// 當(dāng)管理進(jìn)程結(jié)束時調(diào)用它
$serv->on('ManagerStop', function(Swoole\Server $serv){});相關(guān)文章
php實現(xiàn)購物車功能(以大蘋果購物網(wǎng)為例)
本文主要介紹了php實現(xiàn)購物車功能(以大蘋果購物網(wǎng)為例)的實現(xiàn)方法,具有很好的參考價值。下面跟著小編一起來看下吧2017-03-03
php實現(xiàn)阿拉伯?dāng)?shù)字和羅馬數(shù)字相互轉(zhuǎn)換的方法
這篇文章主要介紹了php實現(xiàn)阿拉伯?dāng)?shù)字和羅馬數(shù)字相互轉(zhuǎn)換的方法,涉及php字符串操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04
php curl批處理實現(xiàn)可控并發(fā)異步操作示例
這篇文章主要介紹了php curl批處理實現(xiàn)可控并發(fā)異步操作,結(jié)合實例形式分析了php使用curl的curl_multi_*族函數(shù)進(jìn)行并發(fā)操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2018-05-05
php站內(nèi)搜索關(guān)鍵詞變亮的實現(xiàn)方法
這篇文章主要介紹了php站內(nèi)搜索關(guān)鍵詞變亮的實現(xiàn)方法,以實例形式較為詳細(xì)的分析了數(shù)據(jù)庫表的創(chuàng)建及針對數(shù)據(jù)庫的搜索關(guān)鍵字高亮的實現(xiàn)技巧,非常具有實用價值,需要的朋友可以參考下2014-12-12

