🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# Server->set [TOC] 用于设置运行时的各项参数。服务器启动后通过`$serv->setting`来访问`Server->set`方法设置的参数数组。 原型: ~~~ function Server->set(array $setting); ~~~ 示例: ~~~ $serv->set(array( 'reactor_num' => 2, //reactor thread num 'worker_num' => 4, //worker process num 'backlog' => 128, //listen backlog 'max_request' => 50, 'dispatch_mode' => 1, )); ~~~ > `Server->set`必须在`Server->start`前调用 ## 最大连接 `max_conn => 10000`, 此参数用来设置`Server`最大允许维持多少个`tcp`连接。超过此数量后,新进入的连接将被拒绝。 > 此参数不要调整的过大,根据机器内存的实际情况来设置。底层会根据此数值一次性分配一块大内存来保存`Connection`信息 ## 守护进程化 `daemonize => 1`,加入此参数后,执行`php server.php`将转入后台作为守护进程运行 ## reactor线程数 `reactor_num => 2`,通过此参数来调节`Reactor`线程的数量,以充分利用多核 > `reactor_num`和默认设置为CPU核数 ## worker进程数 `worker_num => 4`,设置启动的`Worker`进程数量。`Swoole`采用固定`Worker`进程的模式。 * 全异步非阻塞服务器`worker_num`配置为`CPU`核数的`1-4`倍即可。 * 同步阻塞服务器,`worker_num`配置为`100`或者更高,具体要看每次请求处理的耗时和操作系统负载状况 > 当设定的`Worker`进程数小于reactor线程数时,会自动调低reactor线程的数量 ## max\_request max\_request => 2000,此参数表示worker进程在处理完n次请求后结束运行。manager会重新创建一个worker进程。此选项用来防止worker进程内存溢出。 > PHP代码也可以使用memory\_get\_usage来检测进程的内存占用情况,发现接近memory\_limit时,调用exit()退出进程。manager进程会回收此进程,然后重新启动一个新的Worker进程。 > onConnect/onClose不增加计数 ~~~ max_request => 0 ~~~ 设置为0表示不自动重启。在Worker进程中需要保存连接信息的服务,需要设置为0. ## Listen队列长度 backlog => 128,此参数将决定最多同时有多少个待accept的连接,swoole本身accept效率是很高的,基本上不会出现大量排队情况。 ## CPU亲和设置 open\_cpu\_affinity => 1 ,启用CPU亲和设置 ## TCP\_NoDelay启用 open\_tcp\_nodelay => 1 ,启用tcp\_nodelay ## TCP\_DEFER\_ACCEPT tcp\_defer\_accept => 5,此参数设定一个秒数,当客户端连接连接到服务器时,在约定秒数内并不会触发accept,直到有数据发送,或者超时时才会触发。 ## 日志文件路径 log\_file => '/data/log/swoole.log', 指定swoole错误日志文件。在swoole运行期发生的异常信息会记录到这个文件中。默认会打印到屏幕。 > 此配置仅在swoole-1.5.8以上版本中可用 ## 数据buffer buffer主要是用于检测数据是否完整,如果不完整swoole会继续等待新的数据到来。直到收到完整的一个请求,才会一次性发送给worker进程。这时onReceive会收到一个超过SW\_BUFFER\_SIZE, 小于$serv->setting\['package\_max\_length'\]的数据。 目前仅提供了EOF检测、固定包头长度检测2种buffer模式。 open\_eof\_check => true打开buffer package\_eof => "\\r\\n\\r\\n" 设置EOF ## 心跳检测机制 heartbeat\_check\_interval => 30 //每隔多少秒检测一次,单位秒,Swoole会轮询所有TCP连接,将超过心跳时间的连接关闭掉 heartbeat\_idle\_time => 60 //TCP连接的最大闲置时间,单位s , 如果某fd最后一次发包距离现在的时间超过heartbeat\_idle\_time会把这个连接关闭。 > 心跳检测特性需要swoole-1.6.10+ > heartbeat\_idle\_time必须大于或等于heartbeat\_check\_interval ## worker进程数据包分配模式 dispatch\_mode = 1 //1平均分配,2按FD取模固定分配,3抢占式分配,默认为取模(dispatch=2) > 抢占式分配,每次都是空闲的worker进程获得数据。很合适SOA/RPC类的内部服务框架 > 当选择为dispatch=3抢占模式时,worker进程内发生onConnect/onReceive/onClose/onTimer会将worker进程标记为忙,不再接受新的请求。reactor会将新请求投递给其他状态为闲的worker进程 > 如果希望每个连接的数据分配给固定的worker进程,dispatch\_mode需要设置为2