重启ThinkPHP6定时任务需终止旧进程并启动新实例,因TP6无热重启机制;Crontab无需重启,think serve需kill再启,Workerman/Swoole用stop/start或restart,第三方扩展有专用指令。

重启 ThinkPHP6 正在运行的定时任务,关键不在于“重跑一次命令”,而在于终止旧进程 + 启动新实例。因为 TP6 本身没有内置的“热重启”机制,所有定时任务(无论是 Crontab 调用、think serve、Worker 还是自定义命令)都以独立 PHP 进程形式运行,必须手动管理其生命周期。
确认当前运行的是哪类定时任务
不同启动方式,重启方法完全不同:
-
Crontab 直接调用脚本(如
*/5 * * * * php /path/to/script.php):它本身无“常驻进程”,每次触发都是全新进程,无需重启——只需修改脚本后等待下个周期自动执行即可 - think serve 或 think start 启动 HTTP 服务:这是守护进程,需先 kill 再重启
- Workerman/Swoole 常驻进程(如自定义 Timer 命令):有明确的 start/stop/reload 控制逻辑
-
第三方 crontab 扩展(如 top-think/think-crontab):通常自带
php think crontab:restart等指令
针对 think serve / think start 的重启操作
这类命令默认后台运行且不生成 PID 文件,容易残留。推荐分步清理再启动:
- 查进程:
ps -ef | grep 'think serve' | grep -v grep,记下 PID - 发优雅终止信号:
kill -TERM [PID](或用killall -q php快速清理所有 PHP CLI 进程) - 等 2–3 秒,再检查是否残留:
lsof -i :8080(替换为你实际端口) - 如有残留,强杀:
kill -KILL [PID] - 重新启动:
php think serve --port=8080 --no-debug(前台模式更可控)
针对 Workerman/Swoole 类定时器的重启
如果你用的是 php think timer start 这类封装命令,应优先使用其内置控制参数:
立即学习“PHP免费学习笔记(深入)”;
- 停止:
php think timer stop - 重启(停+启):
php think timer restart - 若无 restart 指令,按顺序执行:
php think timer stop && sleep 1 && php think timer start - 确保
onWorkerStart中注册了pcntl_signal(SIGTERM, [...]),实现连接关闭、事务回滚、临时文件清理等优雅退出
通用安全建议
避免“一杀全杀”导致误关其他服务:
- 所有 Crontab 条目务必加日志重定向:
2>&1 >> /var/log/tp6-cron.log - 自定义命令中禁用
$_SERVER['argv'],改用$input->getArgument()防止参数解析失败 - 涉及数据库或缓存的操作,必须在退出前显式调用
Db::close()、Cache::clear() - 如需精准 PID 管理,可在启动脚本开头写入
file_put_contents('/tmp/tp6-timer.pid', getmypid());,停止时读取并 kill



















