进程设置
[
'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()的内容写入指定文件中
];