# 配置选项
---
[TOC]
在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两个回调函数,否则启动服务器会报错。<br>
示例:
```php
'task_worker_num' => 8
```
##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'
```
- 序章
- 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支持
- 3 Swoole协议
- 3.1 EOF协议
- 3.2 固定包头协议
- 3.3 Http协议
- 3.4 WebSocket协议
- 3.5 MTQQ协议
- 4 Swoole客户端
- 4.1 Client
- 4.2 异步Http客户端
- 4.3 异步WebSocket客户端
- 4.4 异步MySQL客户端
- 4.5 异步Redis客户端
- 5 Swoole异步IO
- 5.1 AsyncIO
- 5.2 EventLoop
- 6 Swoole使用
- 7 框架应用
- 7.1 ZPHP
- 7.2 TSF
- 7.3 Hprose
- 7.4 Dora-rpc
- 8 已有框架支持
- 8.1 Yaf
- 8.2 Phalcon
- 8.3 Thinkphp
- 9 项目实战
- 附录*配置选项
- 附录*回调函数
- 附录*属性列表
- 附录*函数列表