Swoole 4.x服務(wù)器Server配置和函數(shù)列表
本文總結(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)文章
PHP實(shí)現(xiàn)負(fù)載均衡session共享redis緩存操作示例
這篇文章主要介紹了PHP實(shí)現(xiàn)負(fù)載均衡session共享redis緩存操作,涉及php用戶(hù)登陸、session存儲(chǔ)、判斷等相關(guān)操作技巧,需要的朋友可以參考下2018-08-08簡(jiǎn)單的PHP緩存設(shè)計(jì)實(shí)現(xiàn)代碼
本功能主要是利用文件修改時(shí)間函數(shù)filemtime與現(xiàn)在時(shí)間作減法判斷是否更新內(nèi)容。2011-09-09PHP分頁(yè)顯示的方法分析【附PHP通用分頁(yè)類(lèi)】
這篇文章主要介紹了PHP分頁(yè)顯示的方法,結(jié)合實(shí)例形式分析了php數(shù)據(jù)庫(kù)查詢(xún)及內(nèi)容結(jié)合HTML分頁(yè)顯示的簡(jiǎn)單操作技巧,并附帶一個(gè)PHP通用分頁(yè)類(lèi)供大家參考使用,需要的朋友可以參考下2018-05-05PHP大小寫(xiě)問(wèn)題:函數(shù)名和類(lèi)名不區(qū)分,變量名區(qū)分
這篇文章主要介紹了PHP大小寫(xiě)問(wèn)題,php中變量名是區(qū)分大小寫(xiě)的,而函數(shù)名與類(lèi)名是不區(qū)分的2013-06-06PHP字符串與數(shù)組處理函數(shù)用法小結(jié)
這篇文章主要介紹了PHP字符串與數(shù)組處理函數(shù)用法,結(jié)合實(shí)例形式詳細(xì)分析了PHP字符串與數(shù)組常用處理函數(shù)功能、定義、使用方法與操作注意事項(xiàng),需要的朋友可以參考下2020-01-01