ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
[TOC] --- ``` php $server->set(array( 'daemonize' => true, 'log_file' => '/www/log/swoole.log', 'reactor_num' => 2, 'worker_num' => 2, 'task_worker_num' => 4, 'max_request' => 100, )); ``` ### daemonize 设置是否后台运行。默认是false。设置`daemonize => 1`时,程序将转入后台作为守护进程运行。长时间运行的服务器端程序必须启用此项。 如果不启用守护进程,当ssh终端退出后,程序将被终止运行。 注意: - 启用守护进程后,标准输入和输出会被重定向到 log_file。 - 如果未设置log_file,将重定向到 `/dev/null`,所有打印屏幕的信息都会被丢弃。 ### log_file 指定swoole错误日志文件。在swoole运行期发生的异常信息会记录到这个文件中。默认会打印到屏幕。 注意log_file不会自动切分文件,所以需要定期清理此文件。通过重新打开日志,可以实现按天记录日志。 ### log_level 设置swoole_server错误日志打印的等级,范围是0-5。低于log_level设置的日志信息不会抛出。默认是0 也就是所有级别都打印。 ``` 0 =>DEBUG 1 =>TRACE 2 =>INFO 3 =>NOTICE 4 =>WARNING 5 =>ERROR ``` ### [reactor_num](https://wiki.swoole.com/wiki/page/281.html) reactor线程数,通过此参数来调节主进程内事件处理线程的数量,以充分利用多核。默认会启用CPU核数相同的数量。`reactor_num`一般设置为CPU核数的1-4倍,在swoole中`reactor_num`最大不得超过`CPU核数*4`。 Swoole的主进程是一个多线程的程序。其中有一组很重要的线程,称之为[Reactor线程](https://wiki.swoole.com/wiki/page/347.html)。它就是真正处理TCP连接,收发数据的线程。Reactor线程进行协议解析,将请求投递到Worker进程。 推荐配置:CPU核数。 注意:`reactor_num`必须小于或等于`worker_num`。如果设置的`reactor_num`大于`worker_num`,那么swoole会自动调整使`reactor_num`等于`worker_num`。 ### [worker_num](https://wiki.swoole.com/wiki/page/275.html) 设置启动的worker进程数。`worker_num >= 1`,至少会有一个,默认是 1。设置方法: - 业务代码是全异步非阻塞的,这里设置为CPU的1-4倍最合理。 - 业务代码为同步阻塞,需要根据请求响应时间和系统负载来调整。 比如1个请求耗时100ms,要提供1000QPS的处理能力,那必须配置100个进程或更多。但是需要考虑内存占用。假设每个进程占用40M内存,那100个进程就需要占用4G内存。 推荐配置:CPU核数*2。 ### [task_worker_num](https://wiki.swoole.com/wiki/page/276.html) 配置task进程的数量,配置此参数后将会启用task功能。如果业务用不到异步任务,可以不设置。一旦设置次参数,必须设置`onTask/onFinish`2个事件回调。 注意: - task进程内不能使用`swoole_server->task`方法 - task进程内不能使用`mysql-async/redis-async/swoole_event`等异步IO函数 推荐配置:根据实际异步任务比重设置。 ### [dispatch_mode](https://wiki.swoole.com/wiki/page/277.html) 数据包分发策略。可以选择3种类型,默认为2。一般情况下,HttpServer可以使用1、3;WebSocketServer可以使用默认的2。 * 1,轮循模式,收到会轮循分配给每一个worker进程。 * 2,固定模式,根据连接的文件描述符分配worker。这样可以保证同一个连接发来的数据只会被同一个worker处理。 * 3,抢占模式,主进程会根据Worker的忙闲状态选择投递,只会投递给处于闲置状态的Worker。 * 4,IP分配,根据客户端IP进行取模hash,分配给一个固定的worker进程。可以保证同一个来源IP的连接数据总会被分配到同一个worker进程。算法为 `ip2long(ClientIP) % worker_num`。 * 5,UID分配,需要用户代码中调用 `$serv->bind()` 将一个连接绑定1个uid。然后swoole根据UID的值分配到不同的worker进程。算法为 `UID % worker_num`,如果需要使用字符串作为UID,可以使用`crc32(UID_STRING)` 。 `dispatch_mode`配置在BASE模式是无效的,因为BASE不存在投递任务。 ### [max_request](https://wiki.swoole.com/wiki/page/p-max_request.html) 设置worker进程的最大任务数,默认为0。 **这个参数的主要作用是解决PHP进程内存溢出问题。**一个worker进程在处理完超过max_request数值的任务后将自动退出,进程退出后会释放所有内存和资源。 例如设置为3,假设有2个worker进程,执行5次请求,必然会有一个worker进程会退出并被重新拉起一个新的。如果不设置,就不会执行这个操作。 PHP应用程序有缓慢的内存泄漏,但无法定位到具体原因、无法解决,可以通过设置max_request解决。 如果代码没有内存泄露的问题,没有每访问一次,内存就增加一点,那不设置(默认为0)也不会有内存泄露。反之,max_request,就可以限制内存无限制增长,从而防止内存泄露。(参考http://group.swoole.com/question/106049) ### task_max_request 类似于max_request,默认为5000。用于设置task进程的最大任务数。一个task进程在处理完超过此数值的任务后将自动退出。这个参数是为了防止PHP进程内存溢出。如果不希望进程自动退出可以设置为0。 ### [max_conn (max_connection)](https://wiki.swoole.com/wiki/page/282.html) 服务器程序,最大允许的连接数,如max_conn => 10000, 此参数用来设置Server最大允许维持多少个tcp连接。超过此数量后,新进入的连接将被拒绝。 - 默认值为`ulimit -n`的值。系统的`ulimit -n`可能太小,需要手动设置。例如`ulimit -n 65535`。 - 最大不得超过操作系统`ulimit -n`的值,否则会报一条警告信息,并重置为`ulimit -n`的值。 - 此参数不要调整的过大,根据机器内存的实际情况来设置。 ### heartbeat_idle_time、heartbeat_check_interval heartbeat_idle_time与heartbeat_check_interval配合使用。表示连接最大允许空闲的时间。如: ``` php array( 'heartbeat_idle_time' => 600, //表示连接最大允许空闲的时间 'heartbeat_check_interval' => 60, //表示每隔少秒轮循一次 ); ``` 表示每60秒遍历一次,一个连接如果600秒内未向服务器发送任何数据,此连接将被强制关闭。 - 启用heartbeat_idle_time后,服务器并不会主动向客户端发送数据包,而是被动等待客户端发送心跳。 - 如果只设置了heartbeat_idle_time未设置heartbeat_check_interval底层将不会创建心跳检测线程,PHP代码中可以调用heartbeat方法手工处理超时的连接。 ### open_eof_check、package_eof 设置EOF字符串。package_eof最大只允许传入8个字节的字符串。 ``` php array( 'open_eof_check' => true, //打开EOF检测 'package_eof' => "\r\n", //设置EOF ) ``` 打开EOF检测,此选项将检测客户端连接发来的数据,当数据包结尾是指定的字符串时才会投递给Worker进程。否则会一直拼接数据包,直到超过缓存区或者超时才会中止。当出错时swoole底层会认为是恶意连接,丢弃数据并强制关闭连接。 常见的Memcache/SMTP/POP等协议都是以\r\n结束的,就可以使用此配置。开启后可以保证Worker进程一次性总是收到一个或者多个完整的数据包。 ### open_eof_split EOF检测不会从数据中间查找eof字符串,所以Worker进程可能会同时收到多个数据包,需要在应用层代码中自行`explode("\r\n", $data)` 来拆分数据包。 1.7.15版本增加了open_eof_split,支持从数据中查找EOF,并切分数据。 ### pid_file 在Server启动时自动将master进程的PID写入到文件,在Server关闭时自动删除PID文件。(1.9.5+支持) ``` $server->set(array( 'pid_file' => __DIR__.'/server.pid', )); ``` 其它参数详见:配置选项-Swoole-Swoole文档中心 https://wiki.swoole.com/wiki/page/274.html