swoole Server配置参数

2021-12-05

进程设置

[
	'reactor_num'     => 2, // Reactor线程数,默认值:CPU核数(超过8核时为8),建议设置为CPU核数的1-4倍,必须小于或等于worker_num
	'worker_num'      => 4, // Worker进程数,默认值:CPU核数,业务代码为异步时建议设置为CPU核数的1-4倍,最大允许值为cpu*1000
	'task_worker_num' => 2, // Task进程的数量,最大值为cpu*1000
];

worker进程

[
	'dispatch_mode' => 2,
		// 1、轮循模式 
		// 2、根据连接的文件描述符分配Worker。这样可以保证同一个连接发来的数据只会被同一个Worker处理
		// 3、主进程会根据Worker的忙闲状态选择投递,只会投递给处于闲置状态的Worker
		// 4、根据客户端IP进行取模hash,分配给一个固定的Worker进程。可以保证同一个来源IP的连接数据总会被分配到同一个Worker进程。算法为ip2long(ClientIP) % worker_num
		// 5、需要用户代码中调用Server->bind()将一个连接绑定1个uid。然后底层根据UID的值分配到不同的Worker进程。算法为UID % worker_num,如果需要使用字符串作为 UID,可以使用crc32(UID_STRING)
		// 6、空闲的Worker会accept连接,并接受Reactor的新请求;
		// 无状态Server可以使用1或3,
		// 同步阻塞Server使用3,
		// 异步非阻塞Server使用1,
		// 有状态使用 2、4、5,
		// dispatch_mode配置在SWOOLE_BASE模式是无效的,因为BASE不存在投递任务
	'max_wait_time'           => 3,     // 设置Worker进程收到停止服务通知后最大等待时间
	'enable_unsafe_event'     => false, // dispatch_mode=1或3时启动onConnect/onClose事件
    'discard_timeout_request' => true,  // dispatch_mode=1或3时丢弃已关闭链接的数据请求
    'reload_async'            => true,  // 设置异步重启开关。设置为true时,将启用异步安全重启特性,Worker进程会等待异步事件完成后再退出。主要目的是为了保证服务重载时,协程或异步任务能正常结束
];

task进程

[
	'task_ipc_mode' => 1, 
		// Task进程与 Worker进程之间通信的方式
		// 1、使用Unix Socket通信(默认),支持定向投递,在task和taskwait方法中可指定目标Task进程;
		// 2、使用sysvmsg消息队列通信,支持定向投递;
		// 3、使用sysvmsg消息队列通信,并设置为争抢模式,不支持定向投递
	'task_max_request'      => 0,      // task进程的最大任务数。一个task进程在处理完超过此数值的任务后将自动退出。防止PHP进程内存溢出, 默认0表示不退出
	'task_tmpdir'           => '/tmp', // task的数据临时目录,默认/tmp
	'task_enable_coroutine' => false,  // true开启Task协程支持
	'message_queue_key'     => ftok($php_script_file, 1), // 设置消息队列的KEY; 仅在task_ipc_mode = 2/3时使用。设置的Key仅作为Task任务队列的KEY
	'task_object'           => false,  // 为true时,onTask回调将变成对象模式,默认false
];

请求

[
	//  worker进程的最大任务数,默认0(不会退出进程),一个worker进程处理完超过此请求数的任务将自动退出(释放所有内存和资源);SWOOLE_BASE下,达到max_request重启进程会导致客户端连接断开;worker进程退出时,master进程会重新启动一个新的worker进程
	'max_request' => 50,
	'backlog'     => 128, // 最大同时等待accept的连接数
	'max_conn'    => 1000, // 最大允许连接数(超过时新连接将被拒绝),默认为ulimit -n(当ulimit -n超过100000时为100000),上限为1M,最小为(worker_num + task_worker_num) * 2 + 32);一个TCP连接占用224字节
];

SSL

[
	'ssl_cert_file'         => '',    // SSL隧道加密cert证书的路径
    'ssl_key_file'          => '',    // SSL隧道加密key私钥的路径
    'ssl_protocols'         => 0,     // OpenSSL隧道加密的协议,默认0,支持全部协议
    'ssl_ciphers'           => 'ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP', // openssl加密算法,默认EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
    'ssl_verify_peer'       => false, // 是否验证客户端证书
    'ssl_allow_self_signed' => false, // 是否允许自签名证书
    'ssl_client_cert_file'  => '',    // 根证书,用于验证客户端证书
    'ssl_compress'          => false, // 设置是否启用SSL/TLS压缩
    'ssl_prefer_server_ciphers' => true, // 启用服务器端保护,防止BEAST攻击
];

死链检测--维持长连接

[
	'open_tcp_keepalive'       => true, // 启动死链接检测
	'tcp_keepidle'             => 4,    // 在n秒内没有数据请求,将开始对此连接进行探测
    'tcp_keepcount'            => 5,    // 探测的次数,超过次数后将close此连接。
    'tcp_keepinterval'         => 1,    // 探测的间隔时间,单位秒
];

心跳检测--维持长连接

[
    'heartbeat_check_interval' => 60,   // 启用心跳检测间隔,默认false,如果该连接在heartbeat_idle_time秒内没有向服务器发送任何数据,此连接将被强制关闭;仅支持TCP连接
    'heartbeat_idle_time'      => 120,  // 连接最大允许空闲的时间
];

日志

[
	'log_file'   => '', // 错误日志文件
    'log_level'  => '', // 错误日志打印的等级,范围是 0-6。默认SWOOLE_LOG_INFO
    'log_date_with_microseconds' => false, // 日志精度,是否带微秒,默认false
    'log_rotation' => SWOOLE_LOG_ROTATION_SINGLE, 
    	// 日志切割
    	// SWOOLE_LOG_ROTATION_SINGLE 不启用
	    // SWOOLE_LOG_ROTATION_MONTHLY 每月
	    // SWOOLE_LOG_ROTATION_DAILY   每天
	    // SWOOLE_LOG_ROTATION_HOURLY  每小时
	    // SWOOLE_LOG_ROTATION_EVERY_MINUTE 每分钟
    'log_date_format' => '%Y-%m-%d %H:%M:%S', // 日志时间格式,参考strftime的format
];

协议

[
	'open_http_protocol'      => false,  // 启用HTTP协议处理
    'open_mqtt_protocol'      => false,  // 启用MQTT协议处理,worker进程onReceive每次会返回一个完整的 MQTT 数据包
    'open_redis_protocol'     => false,  // 启用Redis协议处理。worker进程onReceive每次会返回一个完整的 Redis 数据包
    'open_websocket_protocol' => false,  // 启用WebSocket协议处理
];

性能

[
	'open_tcp_nodelay'    => false,       // 开启后TCP连接发送数据时会关闭Nagle合并算法,立即发往对端TCP连接。在某些场景下,如命令行终端,敲一个命令就需要立马发到服务器,可以提升响应速度
    'open_cpu_affinity'   => false,       // 在多核的硬件平台中,启用此特性会将Swoole的reactor线程/worker进程绑定到固定的一个核上。可以避免进程/线程的运行时在多个核之间互相切换,提高CPU Cache的命中率。
    'cpu_affinity_ignore' => array(0, 1), // IO密集型程序中,所有网络中断都是用CPU0来处理,如果网络IO很重,CPU0负载过高会导致网络中断无法及时处理,那网络收发包的能力就会下降。表示CPU0,CPU1专门空出来处理网络中断。
];

基础信息

[
	'user'     => '', // 设置Worker/TaskWorker子进程的所属用户,默认为执行脚本用户
    'group'    => '', // 设置Worker/TaskWorker子进程的所属用户组,默认为执行脚本用户组
    'chroot'   => '', // 重定向Worker进程的文件系统根目录。
    'pid_file' => '', // 设置pid文件地址
];

缓冲内存

[
	'buffer_input_size/input_buffer_size'   => 2*1024*1024, // 接收输入缓存区内存尺寸。
    'buffer_output_size/output_buffer_size' => 2*1024*1024, // 发送输出缓存区内存尺寸
    'socket_buffer_size'                    => 2*1024*1024, // 配置客户端连接的缓存区长度,是worker进程单次send的大小限制
];

协程

[
	'enable_coroutine'           => on,                // 开启异步风格服务器的协程支持,设置为true时,底层自动在onRequest回调中创建协程,开发者无需自行使用go函数创建协程,设置为false时,底层不会自动创建协程,开发者如果要使用协程,必须使用go自行创建协程
    'max_coroutine/max_coro_num' => 100000,            // 设置当前工作进程最大协程数量。
    'hook_flags'                 => SWOOLE_HOOK_SLEEP, // 设置一键协程化Hook的函数范围
];

其他

[
	'daemonize'          => false,
	// 程序将转入后台作为守护进程运行;启用守护进程后,标准输入和输出会被重定向到log_file,如果未设置log_file,将重定向到/dev/null;使用systemd或者supervisord管理Swoole服务时,请勿设置daemonize = 1
 	'package_max_length' => 1, // 设置最大数据包尺寸,单位为字节,默认值2M,最小64K
    'enable_reuse_port'  => false, // 设置端口重用,可以重复启动监听同一个端口的Server程序
    'stats_file'         => '', // 指定stats()内容写入的文件路径。设置后会自动在onWorkerStart时设置一个定时器,定时将stats()的内容写入指定文件中
];

 

{/if}