Swoole 5 防重复启动需结合PID文件存在性检查、进程存活验证(kill -0 + ps命令匹配)及原子化写入(fopen 'x'模式),并配合信号机制优雅启停。

Swoole 5 默认会生成 PID 文件(如 runtime/swoole.pid)用于记录主进程 ID,这是防止重复启动最直接的机制——但仅靠“存在 PID 文件”判断并不安全,因为异常退出后文件残留会导致误判。真正可靠的锁实现,需结合文件存在性检查 + 进程存活验证 + 原子化写入控制。
确认 PID 文件路径与可写性
先检查 config/swoole.php 中的配置项:
-
'pid_file' => runtime_path() . 'swoole.pid'—— 确保路径是绝对路径,且目录存在、当前运行用户有写权限 - 若使用自定义路径(如
/var/run/myapp.pid),需提前创建目录并授权:sudo mkdir -p /var/run/myapp && sudo chown www-data:www-data /var/run/myapp
启动前做双重校验:文件存在 + 进程存活
不能只看 PID 文件是否存在,必须验证该 PID 对应的进程是否确为本服务的主进程:
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 读取
swoole.pid获取 PID(如29854) - 执行
kill -0 29854检查进程是否活跃(返回 0 表示存活,非 0 表示已退出) - 再用
ps -p 29854 -o args=验证进程命令是否含swoole或你的启动脚本名,避免 PID 被其他进程复用 - 只有当 PID 文件存在 且 进程存活 且 命令匹配时,才认定服务已在运行,拒绝新启动
启动时原子化写入 PID 文件
避免竞态条件(两个实例同时判断通过后都去写 PID),应使用独占创建方式:
- PHP 层推荐用
fopen($pid_file, 'x')(x模式即O_CREAT | O_EXCL),失败直接退出,不覆盖也不等待 - 写入成功后立即写入当前主进程 PID:
file_put_contents($pid_file, getmypid()) - 务必在
finally或register_shutdown_function中清理 PID 文件,尤其是异常退出场景
配合信号机制实现优雅启停闭环
PID 文件只是起点,完整防重需和信号协同:
- 停止服务时,优先发
SIGTERM给主进程,等其自然退出后再删 PID 文件 - 若主进程卡死,手动删 PID 文件前,先
kill -TERM $pid尝试优雅终止;仍无响应再kill -KILL $pid - 守护模式下(
daemonize => true),确保ps aux | grep swoole只剩一个 master 进程,避免 worker 残留干扰判断

















