sigusr1用于重启全部worker进程,sigusr2仅重启task worker进程;二者由独立标志位控制,混用会导致非预期重启和连接抖动。

SIGUSR1 和 SIGUSR2 在 Swoole 中用途明确不同:SIGUSR1 重启全部 worker 进程(含普通 worker),SIGUSR2 仅重启 task_worker 进程,两者互不干扰、不可混用。
为什么不能用 SIGUSR1 替代 SIGUSR2
因为 SIGUSR1 会拉起全新的一批普通 worker 进程,而 task_worker 只是其中一部分(如果启用了 task_worker_num)。但真正只影响 task_worker 的逻辑,只在 SIGUSR2 触发路径中被处理。源码里 ManagerProcess.reload_all_worker 和 ManagerProcess.reload_task_worker 是两个独立开关,分别由 SIGUSR1 和 SIGUSR2 设置。误用 SIGUSR1 去“只更新 task 逻辑”,会导致普通 worker 也全部重启——可能引发不必要的连接抖动或状态丢失。
- 普通 worker 通常承载 HTTP/TCP 请求,重启会中断长连接或未完成的协程
- task_worker 多用于异步任务(如发邮件、写日志),重启影响面小且无客户端直连
- 如果你只改了
onTask回调里的代码,却发了 SIGUSR1,等于做了冗余操作
reload() 方法里 $only_reload_taskworker 参数怎么用
PHP 代码中调用 $serv->reload() 时传 true,等价于向主进程发 SIGUSR2;传 false(默认)或不传,则发 SIGUSR1。这个参数本质是控制信号类型,不是“过滤进程”。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
-
$serv->reload(true)→ 发送 SIGUSR2 → 仅 task_worker 逐个重启 -
$serv->reload(false)→ 发送 SIGUSR1 → 所有 worker(含 task_worker)重启 - 该方法必须在 manager 进程或 worker 进程内调用;若在用户自定义子进程(
addProcess)中调用会失败 - 注意:
$serv->reload()不会触发onWorkerStart对 task_worker 的重新加载,除非你在onTask里手动 require —— 它只负责进程生命周期,不自动重载 PHP 文件
常见错误:kill 命令发错信号或 PID 错了
最常踩的坑是信号发给了 worker 进程 PID 而非主进程 PID,或者混淆了信号编号与名字。Swoole 只在 manager 进程中注册了这些信号处理器,worker 进程收到 SIGUSR1 会直接退出(非平滑)。
- 查主进程 PID:看启动日志里的
master pid,或用ps aux | grep swoole | grep -v grep找带manager字样的那一行 - 正确命令:
kill -SIGUSR1 <master_pid></master_pid>或kill -USR1 <master_pid></master_pid>(两者等价) - 错误示范:
kill -USR1 <worker_pid></worker_pid>→ 该 worker 立即终止,不等待请求完成 - 错误示范:
kill -USR1 <task_worker_pid></task_worker_pid>→ 同样立即退出,且 manager 不感知,后续可能报task worker exit unexpectedly
reload 保护机制的实际影响
Swoole 的 reload 有防重入设计:当一次 SIGUSR1 正在执行中,再收到一个 SIGUSR1 会被丢弃;但 SIGUSR1 和 SIGUSR2 不互斥——你可以先发 SIGUSR1,再立刻发 SIGUSR2,后者仍会生效。
- 这意味着:不能靠“连续发两次 SIGUSR1”来加速重启,第二次无效
- 但可以组合使用:比如先 SIGUSR1 更新业务逻辑,再 SIGUSR2 单独刷新任务队列配置
- 判断是否完成:观察
onWorkerStart或onTaskStart日志输出节奏,或用ps aux | grep php看进程启动时间戳变化 - 注意:reload 过程中,
onWorkerStart会被每个新 worker 调用一次,这里才是你做require或opcache_reset()的唯一可靠时机










