需禁用Manager进程并手动保活:创建ProcessPool时设$manager为false;注册onWorkerStart/onWorkerExit;主进程阻塞+SIGCHLD监听+定期检查worker数+优雅关闭;子进程可用协程、事件循环或带信号分发的循环。

在Swoole中用ProcessPool实现自定义守护进程,需绕过Manager进程管理、自行接管子进程生命周期,并确保主进程不退出、子进程异常时能重启——直接new Swoole\ProcessPool后调用start()默认仍受Manager控制,无法满足长期稳定驻留的守护需求。
初始化ProcessPool并禁用Manager接管
创建ProcessPool实例时必须显式关闭manager_process选项,否则Swoole会自动启动Manager进程并接管所有worker,导致你无法自主控制启停逻辑。
new Swoole\ProcessPool($workerNum, SWOOLE_IPC_UNIXSOCK, 0, false);
第四个参数$manager为false,【这是关键前提,设为true将启用Manager进程,彻底交出控制权】;第三个参数$ipc_type建议固定用SWOOLE_IPC_UNIXSOCK(Unix域套接字),避免UDP端口冲突或TCP绑定失败。
注册onWorkerStart与onWorkerExit回调
onWorkerStart用于初始化每个子进程上下文,例如加载配置、连接数据库连接池、设置信号处理器。
onWorkerExit必须实现:记录退出原因、清理资源(如释放Redis连接、关闭文件句柄)、触发重启逻辑。
注意:onWorkerExit中不能调用exit()或die(),否则会中断整个ProcessPool回收流程;应仅做清理,由主循环判断是否拉起新进程。
手动维护主进程常驻与子进程保活
第一步:调用$pool->start()启动池后,主进程不能直接结束,需进入阻塞等待循环。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
第二步:监听SIGCHLD信号,捕获子进程退出事件。使用pcntl_signal(SIGCHLD, function($sig) use ($pool) { $pool->reload(); });
第三步:在主循环中定期检查存活worker数,若低于设定阈值(如$pool->getProcessNum() addWorker()补足。这一步弥补了SIGCHLD可能丢失或延迟的问题。
第四步:捕获SIGTERM/SIGINT信号,执行优雅关闭——先向所有worker发送退出指令(可通过共享内存或消息队列通知),等待最多5秒,再强制kill剩余进程,最后调用$pool->shutdown()释放资源。
子进程内处理业务逻辑
方法一:在onWorkerStart中启动协程调度器,直接运行协程任务。
Co\run(function () { while (true) { // 执行定时采集、日志轮转等任务; co::sleep(10); } });
方法二:使用Swoole\Event::wait()搭配定时器,适合非协程场景。
Event::addTimer(3000, function () { echo "worker heartbeat\n"; });
方法三:阻塞式while循环+usleep,最简单但不推荐——会浪费CPU且无法响应信号。若必须用,务必在循环内插入pcntl_signal_dispatch()和usleep(10000)。

















