宝塔面板为swoole服务配置定时任务需三步:一、确认服务可手动启动并加-d守护;二、添加shell脚本计划任务,用pgrep或lsof判断进程/端口避免重复启动;三、设“重启时”执行周期并勾选“禁止重复执行”,确保系统重启后自动拉起。

在宝塔面板中为Swoole服务配置定时任务,核心目标是让WebSocket服务器、HTTP协程服务或自定义守护进程在系统重启后自动拉起,或按需定期重载配置、清理日志、检测端口占用。这一步不能依赖PHP-FPM的生命周期,必须脱离Web请求链路独立运行。
确认Swoole服务已可手动启动
先确保你的Swoole服务脚本本身能正常运行,否则定时任务只是反复失败。进入项目根目录,执行:php start.php start -d(以常见think-swoole为例)或php server.php start(自定义Swoole Server)。观察是否成功监听端口(如9501),并用netstat -tuln | grep 9501验证。若报错“Class 'Swoole\Http\Server' not found”,说明Swoole扩展未启用,需先回退解决扩展安装问题。
这一步操作起来很简单,直接把文件拖进去就行。但注意:启动命令末尾的-d参数不可省略,它代表守护进程模式,否则任务执行完就退出,起不到长期运行效果。
添加宝塔计划任务
登录宝塔面板 → 左侧菜单点击【计划任务】→ 点击右上角【添加计划任务】。
类型选择【Shell脚本】;执行周期按实际需要设定,例如“每分钟”或“每天0点”;任务名称填“启动Swoole服务”;脚本内容填写完整绝对路径命令:
/www/server/php/80/bin/php /www/wwwroot/your-site.com/start.php start -d
⚠️ 注意:路径中的/www/server/php/80/bin/php必须与你站点实际使用的PHP版本一致。如果用的是PHP74,请改成/www/server/php/74/bin/php;若用PHP81,则为/www/server/php/81/bin/php。用错PHP二进制路径会导致找不到Swoole扩展。
保存后,点击右侧【执行】按钮测试一次。然后立即执行ps aux | grep your-site.com,确认进程已存在且状态为S或R。如果只看到grep自己,说明脚本没真正跑起来。
避免重复启动的关键处理
定时任务每分钟执行一次,但Swoole服务不能重复启动,否则会报错“Address already in use”。必须加一层判断逻辑。
方法一:用pgrep过滤进程再决定是否启动
将原Shell脚本替换为:
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
#!/bin/bash<br>if ! pgrep -f "start.php start" > /dev/null; then<br> /www/server/php/80/bin/php /www/wwwroot/your-site.com/start.php start -d<br>fi
方法二:检查端口是否已被占用(更可靠)
#!/bin/bash<br>if ! lsof -i :9501 > /dev/null; then<br> /www/server/php/80/bin/php /www/wwwroot/your-site.com/start.php start -d<br>else<br> echo "Swoole service is already running on port 9501"<br>fi
方法三:使用systemctl托管(仅限CentOS 7+/Ubuntu 16.04+)
创建/etc/systemd/system/swoole-your-site.service,写入服务定义,再用systemctl enable swoole-your-site开机自启。此方式不依赖宝塔计划任务,但需SSH权限且配置稍复杂。
补充:重启后自动生效的终极方案
第一步:在宝塔【计划任务】中新增一条任务,类型选【Shell脚本】,执行周期设为【重启时**】,脚本内容为:
/www/server/php/80/bin/php /www/wwwroot/your-site.com/start.php start -d
第二步:回到同一任务编辑页,勾选【禁止重复执行】选项。这个开关会自动在脚本开头插入锁机制,防止因系统快速重启导致多次并发启动。
第三步:点击【执行】测试,再执行reboot重启服务器,等待1分钟后检查ps aux | grep start.php,进程应已存在。
【关键前提】:该任务只有在宝塔面板服务本身随系统启动(即bt服务设为开机自启)的前提下才有效。若你曾手动关闭过宝塔自启,需先运行chkconfig bt on(CentOS)或systemctl enable bt(Ubuntu/Debian)。










