不推荐每秒执行定时任务,因crontab最小粒度为分钟;应优先采用Swoole协程定时器(如swoole_timer_tick(1000))实现秒级调度,或评估WebSocket、Redis Pub/Sub等更合理的实时方案。

每秒执行定时任务在 ThinkPHP6 中不推荐直接实现,也不符合常规生产实践。
系统级 Crontab 最小粒度是 每分钟(* * * * *),无法原生支持“每秒”调度;而业务逻辑若真需高频触发(如监控、心跳、实时数据拉取),应改用常驻进程+协程定时器方案,而非依赖外部计划任务。
以下是两种可行路径,按推荐程度排序:
用 Swoole 协程定时器实现毫秒/秒级调度
ThinkPHP6 可集成 Swoole,通过 `swoole_timer_tick()` 创建稳定、低开销的秒级任务: - 确保已安装 Swoole 扩展(PHP 8.0+ 推荐 v5.1+) - 在 `app/common.php` 或独立服务启动文件中注册: ```php if (extension_loaded('swoole')) { swoole_timer_tick(1000, function () { // 每1000ms(即每秒)执行一次 \think\facade\Log::info('每秒任务触发:' . date('Y-m-d H:i:s')); // 此处放你的业务逻辑,如检查队列、刷新状态等 }); } ``` - 启动方式:需以 Swoole 方式运行(如 `php think swoole:start`),不能走普通 Web 或 CLI 命令行调用。用自定义命令 + 外部脚本模拟“每秒”(仅限调试或低负载场景)
Linux Crontab 本身不支持秒级,但可通过 Shell 脚本循环 + sleep 弥补: - 新建脚本 `runtime/cron/second-task.sh`: ```bash #!/bin/bash APP_PATH=$(cd "$(dirname "$0")/../../"; pwd) PHP_CMD=$(which php) while true; do $PHP_CMD $APP_PATH/think my:second-task >> $APP_PATH/runtime/log/second.log 2>&1 sleep 1 done ``` - 赋予执行权限:`chmod +x runtime/cron/second-task.sh` - 使用 `nohup` 后台运行:`nohup ./runtime/cron/second-task.sh &` - 注意:该方式无进程守护、易崩溃、难监控,**禁止用于正式环境**为什么不建议每秒执行?
- 频繁 IO 或数据库操作极易引发锁表、连接耗尽、日志爆炸; - ThinkPHP 的请求生命周期、容器初始化、日志写入等本身有开销,每秒启动一次命令行会显著拖慢系统; - 真实业务中,“每秒”往往是对“实时性”的误解——多数场景只需“1–5 秒内响应”,用长连接、消息队列或协程监听更合理。如确需高频率调度,优先评估是否可转为:
- WebSocket 心跳检测
- Redis Pub/Sub 实时通知
- 数据库 binlog 监听(如 Canal)
- Swoole HTTP/WebSocket Server 内置定时器
不复杂但容易忽略。



















