# 配置選項
---
[TOC=2,3]
在swoole中,一個swoole_server的相關屬性可以通過
```php
$serv->set( array $configs );
```
函數來配置,這些配置選項使得swoole更加靈活。
示例:
```php
$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,
));
```
配置選項以及相關介紹如下:
## reactor_num
描述:指定Reactor線程數<br>
說明:設置主進程內事件處理線程的數量,默認會啟用CPU核數相同的數量,
一般設置為CPU核數的**1-4倍**,最大不得超過CPU核數*4。<br>
示例:<br>
```php
'reactor_num' => 8
```
## worker_num
描述:指定啟動的worker進程數
說明:開啟的worker進程數越多,server負載能力越大,但是相應的server占有的內存也會更多。同時,當worker進程數過多時,進程間切換帶來的系統開銷也會更大。因此建議開啟的worker進程數為cpu核數的**1-4**倍。
示例:
```php
'worker_num' => 8
```
## max_request
描述:每個worker進程允許處理的最大任務數。<br>
說明:設置該值后,每個worker進程在處理完max_request個請求后就會自動重啟。設置該值的主要目的是為了防止worker進程處理大量請求后可能引起的內存溢出。<br>
示例:<br>
```php
'max_request' => 10000
```
## max_conn
描述:服務器允許維持的最大TCP連接數<br>
說明:設置此參數后,當服務器已有的連接數達到該值時,新的連接會被拒絕。另外,該參數的值不能超過操作系統**ulimit -n**的值,同時此值也不宜設置過大,因為swoole_server會**一次性申請一大塊內存**用于存放每一個connection的信息。<br>
示例:<br>
```php
'max_conn' => 10000
```
## ipc_mode
描述:設置進程間的通信方式。<br>
說明:共有三種通信方式,參數如下:<br>
- 1 => 使用unix socket通信
- 2 => 使用消息隊列通信
- 3 => 使用消息隊列通信,并設置為爭搶模式
示例:<br>
```php
'ipc_mode' => 1
```
## dispatch_mode
描述:指定數據包分發策略。<br>
說明:共有三種模式,參數如下:<br>
>- 1 => 輪循模式,收到會輪循分配給每一個worker進程
>- 2 => 固定模式,根據連接的文件描述符分配worker。這樣可以保證同一個連接發來的數據只會被同一個worker處理
>- 3 => 搶占模式,主進程會根據Worker的忙閑狀態選擇投遞,只會投遞給處于閑置狀態的Worker
示例:
```php
'dispatch_mode' => 2
```
## task_worker_num
描述:服務器開啟的task進程數。<br>
說明:設置此參數后,服務器會開啟異步task功能。此時可以使用**task**方法投遞異步任務。<br>
>設置此參數后,必須要給swoole_server設置onTask/onFinish兩個回調函數,否則啟動服務器會報錯。
示例:
```php
'task_worker_num' => 8
```
Task進程是同步阻塞的,配置方式與Worker同步模式一致。
* Task進程內不能使用swoole_server->task方法
* Task進程內不能使用swoole_mysql、swoole_redis、swoole_event等異步IO函數
## task_max_request
描述:每個task進程允許處理的最大任務數。<br>
說明:參考[max_request](#2max_request)
task_worker_num<br>
示例:<br>
```php
'task_max_request' => 10000
```
## task_ipc_mode
描述:設置task進程與worker進程之間通信的方式。<br>
說明:參考[ipc_mode](#4ipc_mode)<br>
示例:<br>
```php
'task_ipc_mode' => 2
```
## task_tmpdir
描述:設置task的數據臨時目錄<br>
說明:在swoole_server中,如果投遞的數據超過8192字節,將啟用臨時文件來保存數據。這里的task_tmpdir就是用來設置臨時文件保存的位置。<br>
>需要swoole-1.7.7+
示例:<br>
```php
'task_tmpdir' => '/tmp/task/'
```
## daemonize
描述:設置程序進入后臺作為守護進程運行。<br>
說明:長時間運行的服務器端程序必須啟用此項。如果不啟用守護進程,當ssh終端退出后,程序將被終止運行。啟用守護進程后,標準輸入和輸出會被重定向到 [log_file](#10log_file),如果 [log_file](#10log_file)未設置,則所有輸出會被丟棄。<br>
示例:<br>
```php
'daemonize' => 0
```
## log_file
描述:指定日志文件路徑<br>
說明:在swoole運行期發生的異常信息會記錄到這個文件中。默認會打印到屏幕。注意log_file **不會自動切分文件**,所以需要定期清理此文件。<br>
示例:<br>
```php
'log_file' => '/data/log/swoole.log'
```
## log_level
描述:設置`swoole_server`錯誤日志打印的等級<br>
說明:等級范圍是0-5,低于log_level設置的日志信息不會拋出。<br>
示例:<br>
```php
'log_level' => '1
```
## heartbeat_check_interval
描述:設置心跳檢測間隔<br>
說明:此選項表示每隔多久輪循一次,單位為秒。每次檢測時遍歷所有連接,如果某個連接在間隔時間內沒有數據發送,則強制關閉連接(會有onClose回調)。<br>
示例:<br>
```php
'heartbeat_check_interval' => 60
```
## heartbeat_idle_time
描述:設置某個連接允許的最大閑置時間。<br>
說明:該參數配合[heartbeat_check_interval](#11heartbeat_check_interval)使用。每次遍歷所有連接時,如果某個連接在[heartbeat_idle_time](#12heartbeat_idle_time)時間內沒有數據發送,則強制關閉連接。默認設置為[heartbeat_check_interval](#11heartbeat_check_interval) * 2。<br>
示例:<br>
```php
'heartbeat_idle_time' => 600
```
## open_eof_split
描述:打開eof檢測功能<br>
說明:與[package_eof ](#14package_eof )配合使用。此選項將檢測客戶端連接發來的數據,當數據包結尾是指定的[package_eof ](#14package_eof )字符串時才會將數據包投遞至Worker進程,否則會一直拼接數據包直到緩存溢出或超時才會終止。一旦出錯,該連接會被判定為惡意連接,數據包會被丟棄并強制關閉連接。<br>
> EOF檢測不會從數據中間查找eof字符串,所以Worker進程可能會同時收到多個數據包,需要在應用層代碼中自行**explode("\r\n", $data)** 來拆分數據包<br>
示例:
```php
'open_eof_split' => true
```
## package_eof
描述:設置EOF字符串<br>
說明:package_eof最大只允許傳入**8個**字節的字符串<br>
示例:<br>
```php
'package_eof ' => '/r/n'
```
## open_length_check
描述:打開包長檢測<br>
說明:包長檢測提供了**固定包頭+包體**這種格式協議的解析,。啟用后,可以保證Worker進程onReceive每次都會收到一個完整的數據包。<br>
示例:<br>
```php
'open_length_check' => true
```
## package_length_offset
描述:包頭中第幾個字節開始存放了長度字段<br>
說明:配合[open_length_check](#15open_length_check)使用,用于指明長度字段的位置。<br>
示例:<br>
```php
'package_length_offset' => 5
```
## package_body_offset
描述:從第幾個字節開始計算長度。<br>
說明:配合[open_length_check](#15open_length_check)使用,用于指明包頭的長度。<br>
示例:<br>
```php
'package_body_offset' => 10
```
## package_length_type
描述:指定包長字段的類型<br>
說明:配合[open_length_check](#15open_length_check)使用,指定長度字段的類型,參數如下:<br>
- 's' => int16_t 機器字節序
- 'S' => uint16_t 機器字節序
- 'n' => uint16_t 大端字節序
- ’N‘ => uint32_t 大端字節序
- 'L' => uint32_t 機器字節序
- 'l' => int 機器字節序
示例:<br>
```php
'package_length_type' => 'N'
```
## package_max_length
描述:設置最大數據包尺寸<br>
說明:該值決定了數據包緩存區的大小。如果緩存的數據超過了該值,則會引發錯誤。具體錯誤處理由開啟的協議解析的類型決定。<br>
示例:<br>
```php
'package_max_length' => 8192
```
## open_cpu_affinity
描述:啟用CPU親和性設置<br>
說明:在多核的硬件平臺中,啟用此特性會將swoole的reactor線程/worker進程綁定到固定的一個核上。可以避免進程/線程的運行時在多個核之間互相切換,提高CPU Cache的命中率。<br>
示例:<br>
```php
'open_cpu_affinity' => true
```
## cpu_affinity_ignore
描述:設置不使用指定的CPU核<br>
說明:IO密集型程序中,所有網絡中斷都是用CPU0來處理,如果網絡IO很重,CPU0負載過高會導致網絡中斷無法及時處理,那網絡收發包的能力就會下降。此參數用于設置將特定的CPU內核空出專門用于處理網絡中斷。<br>
接受一個數組作為參數,array(0, 1) 表示不使用CPU0,CPU1 <br>
>此選項必須與open_cpu_affinity同時設置才會生效
示例:<br>
```php
'cpu_affinity_ignore' => array(0, 1)
```
## open_tcp_nodelay
描述:啟用open_tcp_nodelay<br>
說明:開啟后TCP連接發送數據時會無關閉Nagle合并算法,立即發往客戶端連接。在某些場景下,如http服務器,可以提升響應速度。<br>
示例:<br>
```php
'open_tcp_nodelay' => true
```
## tcp_defer_accept
描述:啟用tcp_defer_accept特性<br>
說明:啟動后,只有一個TCP連接有數據發送時才會觸發accept。<br>
示例:<br>
```php
'tcp_defer_accept' => true
```
## open_tcp_keepalive
描述:打開TCP的KEEP_ALIVE選項<br>
說明:使用TCP內置的keep_alive屬性,用于保證連接不會因為長時閑置而被關閉。<br>
示例:<br>
```php
'open_tcp_keepalive' => true
```
## tcp_keepidle
描述:指定探測間隔。<br>
說明:配合[open_tcp_keepalive](#24open_tcp_keepalive)使用,如果某個連接在[tcp_keepidle](#25tcp_keepidle)內沒有任何數據來往,則進行探測。<br>
示例:<br>
```php
'tcp_keepidle' => 600
```
## tcp_keepinterval
描述:指定探測時的發包間隔<br>
說明:配合[open_tcp_keepalive](#24open_tcp_keepalive)使用<br>
示例:<br>
```php
'tcp_keepinterval' => 60
```
## tcp_keepcount
描述:指定探測的嘗試次數<br>
說明:配合[open_tcp_keepalive](#24open_tcp_keepalive)使用,若[tcp_keepcount](#27tcp_keepcount)次嘗試后仍無響應,則判定連接已關閉。<br>
示例:<br>
```php
'tcp_keepcount' => 5
```
## backlog
描述:指定Listen隊列長度<br>
說明:此參數將決定最多同時有多少個等待accept的連接。<br>
示例:<br>
```php
'backlog' => 128
```
## chroot
描述:重定向Worker進程的文件系統根目錄<br>
說明:此設置可以使進程對文件系統的讀寫與實際的操作系統文件系統隔離。提升安全性。<br>
>需要swoole-1.7.9+
示例:<br>
```php
'chroot' => '/data/server/'
```
## user/group
描述:設置worker/task子進程的所屬用戶/用戶組<br>
說明:此設置可以使進程對文件系統的讀寫與實際的操作系統文件系統隔離。提升安全性。<br>
>需要swoole-1.7.9+
僅在使用root用戶啟動時有效
示例:<br>
```php
'user' => 'www'
'group' => 'www'
```
## discard_timeout_request
描述:設置是否丟棄已經超時的請求<br>
說明:swoole在配置dispatch_mode=1或3后,系統無法保證onConnect/onReceive/onClose的順序,因此可能會有一些請求數據在連接關閉后,才能到達Worker進程。<br>
> discard_timeout_request配置默認為true,表示如果worker進程收到了已關閉連接的數據請求,將自動丟棄。
discard_timeout_request如果設置為false,表示無論連接是否關閉Worker進程都會處理數據請求。
需要swoole-1.7.16+
示例:<br>
```php
'discard_timeout_request' => true
```
## enable_reuse_port
描述:設置端口重用<br>
說明:此參數用于優化TCP連接的Accept性能,啟用端口重用后多個進程可以同時進行Accept操作。<br>
>僅在Linux-3.9.0以上版本的內核可用
示例:<br>
```php
'enable_reuse_port' => true
```
## ssl_cert_file和ssl_key_file
描述:設置SSL隧道加密<br>
說明:設置值為一個文件名字符串,指定**cert證書**和**key**的路徑。<br>
示例:<br>
```php
'ssl_cert_file' => '/config/ssl.crt',
'ssl_key_file' => '/config//ssl.key',
```
## ssl_client_cert_file
描述:指定CA證書路徑<br>
說明:開啟雙向SSL認證時,需要指定客戶端所使用的CA證書<br>
示例:<br>
```php
'ssl_client_cert_file' => '../ca.crt'
```
## ssl_verify_depth
描述:設置客戶證書認證鏈的長度<br>
說明:開啟雙向SSL認證時使用<br>
示例:<br>
```php
'ssl_verify_depth' => 1
```
## ssl_method
描述:設置OpenSSL隧道加密的算法<br>
說明:Server與Client使用的算法必須一致,否則SSL/TLS握手會失敗,連接會被切斷。 默認算法為 SWOOLE_SSLv23_METHOD<br>
>SWOOLE_SSLv3_METHOD
SWOOLE_SSLv3_SERVER_METHOD
SWOOLE_SSLv3_CLIENT_METHOD
SWOOLE_SSLv23_METHOD(默認加密方法)
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
示例:<br>
```php
'ssl_method' => SWOOLE_SSLv23_METHOD
```
## ssl_ciphers
描述:配置SSL加密套件<br>
說明:啟用http2協議后,Chrome/Firefox等瀏覽器要求必須使用高強度加密套件。某些低版本瀏覽器可能不支持默認的加密套件,可設置為空字符串兼容低版本瀏覽器
<br>?
示例:<br>
```php
'ssl_ciphers' => 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'
```
- swoole簡介
- swoole功能概述
- 序章
- 開發必讀
- 1 環境搭建
- 1.1 環境搭建
- 1.2 搭建Echo服務器
- 2 初識Swoole
- 2.1 Worker進程
- 2.2 TaskWorker進程
- 2.3 Timer定時器
- 2.4 Process進程
- 2.5 Table內存表
- 2.6 多端口監聽
- 2.7 sendfile文件支持
- 2.8 SSL支持
- 2.9 熱重啟
- 2.10 http_server
- 附錄*server配置
- 附錄*server函數
- 附錄*server屬性
- 附錄*server回調函數
- 附錄*server高級特性
- 心跳檢測
- 3 Swoole協議
- 3.1 EOF協議
- 3.2 固定包頭協議
- 3.3 Http協議
- 3.4 WebSocket協議
- 3.5 MTQQ協議
- 內置http_server
- 內置websocket_server
- Swoole\Redis\Server
- 4 Swoole異步IO
- 4.1 AsyncIO
- 異步文件系統IO
- swoole_async_readfile
- swoole_async_writefile
- swoole_async_read
- swoole_async_write
- 5 swoole異步客戶端
- ws_client
- http_client
- mysql_client
- redis_client
- tcp_client
- http2_client
- 6 swoole協程
- Swoole\Coroutine\Http\Client
- Swoole\Coroutine\MySQL
- Swoole\Coroutine\Redis
- Coroutine\PostgreSQL
- Swoole\Coroutine\Client
- Swoole\Coroutine\Socket
- Swoole\Coroutine\Channel
- Coroutine
- Swoole\Coroutine::create
- Swoole\Coroutine::resume
- Swoole\Coroutine::suspend
- Swoole\Coroutine::sleep
- Coroutine::getaddrinfo
- Coroutine::gethostbyname
- swoole_async_dns_lookup_coro
- Swoole\Coroutine::getuid
- getDefer
- setDefer
- recv
- Coroutine::stats
- Coroutine::fread
- Coroutine::fget
- Coroutine::fwrite
- Coroutine::readFIle
- Coroutine::writeFIle
- Coroutine::exec
- 7 swoole_process
- process::construct
- process::start
- process::name
- process::signal
- process::setaffinity
- process::exit
- process::kill
- process::daemon
- process->exec
- process::wait
- process::alarm
- 8 swoole定時器
- swoole_timer_tick
- swoole_timer_after
- swoole_timer_clear
- 9 swoole_event
- swoole_event_add
- swoole_event_set
- swoole_event_del
- swoole_event_wait
- swoole_event_defer
- swoole_event_write
- swoole_event_exit
- swoole提供的function
- 常見問題
- 客戶端鏈接失敗原因
- 如何設置進程數
- 如何實現異步任務
- 如何選擇swoole三種模式
- php中哪些函數是阻塞的
- 是否可以共用1個redis或mysql連接
- 如何在回調函數中訪問外部的變量
- 為什么不要send完后立即close
- 不同的Server程序實例間如何通信
- MySQL的連接池、異步、斷線重連
- 在php-fpm或apache中使用swoole
- 學習Swoole需要掌握哪些基礎知識
- 在phpinfo中有在php-m中沒有
- 同步阻塞與異步非阻塞選擇
- CURL發送POST請求服務器端超時
- 附錄
- 預定義常量
- 內核參數調優
- php四種回調寫法
- 守護進程程序常用數據結構
- swoole生命周期
- swoole_server中內存管理機制
- 使用jemalloc優化swoole內存分配性能
- Reactor、Worker、Task的關系
- Manager進程
- Swoole的實現
- Reactor線程
- 安裝擴展
- swoole-worker手冊
- swoole相關開源項目
- 寫在后面的話
- 版本更新記錄
- 4.0