ThinkPHP6定时任务优化需从任务注册、执行方式、资源隔离、失败处理四方面入手:统一配置、Swoole协程定时器、分级队列、调度与执行分离。

ThinkPHP6 定时任务性能优化,核心在于减少调度延迟、避免单点瓶颈、提升执行稳定性。不依赖高频轮询或被动触发,而是从任务注册、执行方式、资源隔离和失败处理四个层面系统改进。
用集中式任务配置替代分散 Crontab
直接在服务器写 crontab 每分钟调用 php think command,看似简单,但存在明显问题:多个任务需多行配置、修改后要手动重载、无法动态启停、日志分散难追踪。
- 推荐使用
top-think/think-crontab扩展,在config/crontab.php统一管理所有任务 - 每个任务绑定具体类(如
\app\task\SyncOrderStatus::class),表达式支持秒级精度(如"*/5 * * * * *" → 每5秒执行) - 启动只需一条命令:
php think crontab:start,支持热重载(改配置后自动生效)
启用 Swoole 协程定时器替代 CLI 轮询
传统 php think queue:listen 或每分钟拉起进程的方式,启动开销大、内存占用高、并发能力弱。Swoole 协程定时器可常驻内存、毫秒级精度、低资源消耗。
- 确保已安装 Swoole 扩展(v5.0+),并在
config/app.php的providers中注册think\worker\Provider::class - 在
app/common.php或独立服务启动文件中使用swoole_timer_tick(3000, [...])实现稳定心跳 - 关键逻辑务必协程安全:数据库连接用
Swoole\Coroutine\MySQL,Redis 用Swoole\Coroutine\Redis,避免阻塞主线程
按业务分级调度,隔离高/低优先级任务
订单确认、支付回调等核心任务不能和日志清理、缓存预热混跑——一旦低优任务卡住,可能拖垮整个调度循环。
立即学习“PHP免费学习笔记(深入)”;
- 为不同任务分配独立队列名(如
critical、normal、low),在config/queue.php中配置对应连接与重试策略 - 高优任务设置
'retry_after' => 30,低优任务设为300;失败后推入专用告警通道(如 Redis Stream + 钉钉 Webhook) - 消费者进程分组启动:
php think queue:work --queue=critical --processes=8,--processes值建议设为 CPU 核数 × 1.5
精简任务逻辑 + 异步解耦耗时操作
一个定时任务内直接查库、发短信、写文件、调第三方 API,极易超时失败。应把“调度”和“执行”分离。
- 定时任务本身只做轻量判断与投递,例如:
Job::dispatch(['order_id' => $id])->onQueue('critical') - 真正耗时操作由独立消费者处理,支持失败重试、限流、降级(如短信发送失败时自动切到站内信)
- 对批量数据处理,禁用
chunk默认主键推断,显式指定排序字段(如->chunk(500, ..., 'orders.id')),防止连表场景下 SQL 错误或重复处理



















