在swoole中,一個(gè)swoole_server的相關(guān)屬性可以通過
$serv->set( $array configs );
函數(shù)來配置,這些配置選項(xiàng)使得swoole更加靈活。 示例:
$serv = new swoole_server("0.0.0.0", 9501);
$serv->set(array(
'worker_num' => 8,
'max_request' => 10000,
'max_conn' => 100000,
'dispatch_mode' => 2,
'debug_mode'=> 1,
'daemonize' => false,
));
配置選項(xiàng)以及相關(guān)介紹如下:
描述:指定啟動(dòng)的worker進(jìn)程數(shù)。
說明:swoole是master-> n * worker的模式,開啟的worker進(jìn)程數(shù)越多,server負(fù)載能力越大,但是相應(yīng)的server占有的內(nèi)存也會(huì)更多。同時(shí),當(dāng)worker進(jìn)程數(shù)過多時(shí),進(jìn)程間切換帶來的系統(tǒng)開銷也會(huì)更大。因此建議開啟的worker進(jìn)程數(shù)為cpu核數(shù)的1-4倍。
示例:
'worker_num' => 8
描述:每個(gè)worker進(jìn)程允許處理的最大任務(wù)數(shù)。
說明:設(shè)置該值后,每個(gè)worker進(jìn)程在處理完max_request個(gè)請(qǐng)求后就會(huì)自動(dòng)重啟。設(shè)置該值的主要目的是為了防止worker進(jìn)程處理大量請(qǐng)求后可能引起的內(nèi)存溢出。
示例:
'max_request' => 10000
描述:服務(wù)器允許維持的最大TCP連接數(shù)
說明:設(shè)置此參數(shù)后,當(dāng)服務(wù)器已有的連接數(shù)達(dá)到該值時(shí),新的連接會(huì)被拒絕。另外,該參數(shù)的值不能超過操作系統(tǒng)ulimit -n的值,同時(shí)此值也不宜設(shè)置過大,因?yàn)閟woole_server會(huì)一次性申請(qǐng)一大塊內(nèi)存用于存放每一個(gè)connection的信息。
示例:
'max_conn' => 10000
描述:設(shè)置進(jìn)程間的通信方式。
說明:共有三種通信方式,參數(shù)如下:
- 1 => 使用unix socket通信
- 2 => 使用消息隊(duì)列通信
- 3 => 使用消息隊(duì)列通信,并設(shè)置為爭搶模式
示例:
'ipc_mode' => 1
描述:指定數(shù)據(jù)包分發(fā)策略。
說明:共有三種模式,參數(shù)如下:
- 1 => 輪循模式,收到會(huì)輪循分配給每一個(gè)worker進(jìn)程
- 2 => 固定模式,根據(jù)連接的文件描述符分配worker。這樣可以保證同一個(gè)連接發(fā)來的數(shù)據(jù)只會(huì)被同一個(gè)worker處理
- 3 => 搶占模式,主進(jìn)程會(huì)根據(jù)Worker的忙閑狀態(tài)選擇投遞,只會(huì)投遞給處于閑置狀態(tài)的Worker
示例:
'dispatch_mode' => 2
描述:服務(wù)器開啟的task進(jìn)程數(shù)。
說明:設(shè)置此參數(shù)后,服務(wù)器會(huì)開啟異步task功能。此時(shí)可以使用task方法投遞異步任務(wù)。
設(shè)置此參數(shù)后,必須要給swoole_server設(shè)置onTask/onFinish兩個(gè)回調(diào)函數(shù),否則啟動(dòng)服務(wù)器會(huì)報(bào)錯(cuò)。
示例:
'task_worker_num' => 8
描述:每個(gè)task進(jìn)程允許處理的最大任務(wù)數(shù)。
說明:參考max_request task_worker_num
示例:
'task_max_request' => 10000
描述:設(shè)置task進(jìn)程與worker進(jìn)程之間通信的方式。
說明:參考ipc_mode
示例:
'task_ipc_mode' => 2
描述:設(shè)置程序進(jìn)入后臺(tái)作為守護(hù)進(jìn)程運(yùn)行。
說明:長時(shí)間運(yùn)行的服務(wù)器端程序必須啟用此項(xiàng)。如果不啟用守護(hù)進(jìn)程,當(dāng)ssh終端退出后,程序?qū)⒈唤K止運(yùn)行。啟用守護(hù)進(jìn)程后,標(biāo)準(zhǔn)輸入和輸出會(huì)被重定向到 log_file,如果 log_file未設(shè)置,則所有輸出會(huì)被丟棄。
示例:
'daemonize' => 0
描述:指定日志文件路徑
說明:在swoole運(yùn)行期發(fā)生的異常信息會(huì)記錄到這個(gè)文件中。默認(rèn)會(huì)打印到屏幕。注意log_file 不會(huì)自動(dòng)切分文件,所以需要定期清理此文件。
示例:
'log_file' => '/data/log/swoole.log'
描述:設(shè)置心跳檢測間隔
說明:此選項(xiàng)表示每隔多久輪循一次,單位為秒。每次檢測時(shí)遍歷所有連接,如果某個(gè)連接在間隔時(shí)間內(nèi)沒有數(shù)據(jù)發(fā)送,則強(qiáng)制關(guān)閉連接(會(huì)有onClose回調(diào))。
示例:
'heartbeat_check_interval' => 60
描述:設(shè)置某個(gè)連接允許的最大閑置時(shí)間。
說明:該參數(shù)配合heartbeat_check_interval使用。每次遍歷所有連接時(shí),如果某個(gè)連接在heartbeat_idle_time時(shí)間內(nèi)沒有數(shù)據(jù)發(fā)送,則強(qiáng)制關(guān)閉連接。默認(rèn)設(shè)置為heartbeat_check_interval * 2。
示例:
'heartbeat_idle_time' => 600
描述:打開eof檢測功能
說明:與package_eof 配合使用。此選項(xiàng)將檢測客戶端連接發(fā)來的數(shù)據(jù),當(dāng)數(shù)據(jù)包結(jié)尾是指定的package_eof 字符串時(shí)才會(huì)將數(shù)據(jù)包投遞至Worker進(jìn)程,否則會(huì)一直拼接數(shù)據(jù)包直到緩存溢出或超時(shí)才會(huì)終止。一旦出錯(cuò),該連接會(huì)被判定為惡意連接,數(shù)據(jù)包會(huì)被丟棄并強(qiáng)制關(guān)閉連接。
EOF檢測不會(huì)從數(shù)據(jù)中間查找eof字符串,所以Worker進(jìn)程可能會(huì)同時(shí)收到多個(gè)數(shù)據(jù)包,需要在應(yīng)用層代碼中自行explode("\r\n", $data) 來拆分?jǐn)?shù)據(jù)包
示例:
'open_eof_check' => true
描述:設(shè)置EOF字符串
說明:package_eof最大只允許傳入8個(gè)字節(jié)的字符串
示例:
'package_eof ' => '/r/n'
描述:打開包長檢測
說明:包長檢測提供了固定包頭+包體這種格式協(xié)議的解析,。啟用后,可以保證Worker進(jìn)程onReceive每次都會(huì)收到一個(gè)完整的數(shù)據(jù)包。
示例:
'open_length_check' => true
描述:包頭中第幾個(gè)字節(jié)開始存放了長度字段
說明:配合open_length_check使用,用于指明長度字段的位置。
示例:
'package_length_offset' => 5
描述:從第幾個(gè)字節(jié)開始計(jì)算長度。
說明:配合open_length_check使用,用于指明包頭的長度。
示例:
'package_body_offset' => 10
描述:指定包長字段的類型
說明:配合open_length_check使用,指定長度字段的類型,參數(shù)如下:
- 's' => int16_t 機(jī)器字節(jié)序
- 'S' => uint16_t 機(jī)器字節(jié)序
- 'n' => uint16_t 大端字節(jié)序
- ’N‘ => uint32_t 大端字節(jié)序
- 'L' => uint32_t 機(jī)器字節(jié)序
- 'l' => int 機(jī)器字節(jié)序
示例:
'package_length_type' => 'N'
描述:設(shè)置最大數(shù)據(jù)包尺寸
說明:該值決定了數(shù)據(jù)包緩存區(qū)的大小。如果緩存的數(shù)據(jù)超過了該值,則會(huì)引發(fā)錯(cuò)誤。具體錯(cuò)誤處理由開啟的協(xié)議解析的類型決定。
示例:
'package_max_length' => 8192
描述:啟用CPU親和性設(shè)置
說明:在多核的硬件平臺(tái)中,啟用此特性會(huì)將swoole的reactor線程/worker進(jìn)程綁定到固定的一個(gè)核上。可以避免進(jìn)程/線程的運(yùn)行時(shí)在多個(gè)核之間互相切換,提高CPU Cache的命中率。
示例:
'open_cpu_affinity' => true
描述:啟用open_tcp_nodelay
說明:開啟后TCP連接發(fā)送數(shù)據(jù)時(shí)會(huì)無關(guān)閉Nagle合并算法,立即發(fā)往客戶端連接。在某些場景下,如http服務(wù)器,可以提升響應(yīng)速度。
示例:
'open_tcp_nodelay' => true
描述:啟用tcp_defer_accept特性
說明:啟動(dòng)后,只有一個(gè)TCP連接有數(shù)據(jù)發(fā)送時(shí)才會(huì)觸發(fā)accept。
示例:
'tcp_defer_accept' => true
描述:設(shè)置SSL隧道加密
說明:設(shè)置值為一個(gè)文件名字符串,指定cert證書和key的路徑。
示例:
'ssl_cert_file' => '/config/ssl.crt',
'ssl_key_file' => '/config//ssl.key',
描述:打開TCP的KEEP_ALIVE選項(xiàng)
說明:使用TCP內(nèi)置的keep_alive屬性,用于保證連接不會(huì)因?yàn)殚L時(shí)閑置而被關(guān)閉。
示例:
'open_tcp_keepalive' => true
描述:指定探測間隔。
說明:配合open_tcp_keepalive使用,如果某個(gè)連接在tcp_keepidle內(nèi)沒有任何數(shù)據(jù)來往,則進(jìn)行探測。
示例:
'tcp_keepidle' => 600
描述:指定探測時(shí)的發(fā)包間隔
說明:配合open_tcp_keepalive使用
示例:
'tcp_keepinterval' => 60
描述:指定探測的嘗試次數(shù)
說明:配合open_tcp_keepalive使用,若tcp_keepcount次嘗試后仍無響應(yīng),則判定連接已關(guān)閉。
示例:
'tcp_keepcount' => 5
描述:指定Listen隊(duì)列長度
說明:此參數(shù)將決定最多同時(shí)有多少個(gè)等待accept的連接。
示例:
'backlog' => 128
描述:指定Reactor線程數(shù)
說明:設(shè)置主進(jìn)程內(nèi)事件處理線程的數(shù)量,默認(rèn)會(huì)啟用CPU核數(shù)相同的數(shù)量, 一般設(shè)置為CPU核數(shù)的1-4倍,最大不得超過CPU核數(shù)*4。
示例:
'reactor_num' => 8
描述:設(shè)置task的數(shù)據(jù)臨時(shí)目錄
說明:在swoole_server中,如果投遞的數(shù)據(jù)超過8192字節(jié),將啟用臨時(shí)文件來保存數(shù)據(jù)。這里的task_tmpdir就是用來設(shè)置臨時(shí)文件保存的位置。
需要swoole-1.7.7+
示例:
'task_tmpdir' => '/tmp/task/'
除以上29個(gè)選項(xiàng)外,還有幾個(gè)不常用或者已廢棄的選項(xiàng)沒有給出。以后如果有實(shí)際需求,會(huì)補(bǔ)充說明。
更多建議: