thinkphp定时任务需手动创建命令类并由crontab调用:一、在app/command/下建继承think\console\command的类,用php think make:command生成,configure()设命令名,execute()写业务逻辑;二、本地执行php think命令测试;三、crontab中用绝对路径cd项目根目录后执行php think指令并重定向日志。

Linux 下 ThinkPHP 定时任务不是框架自己“跑起来”的,而是靠你写好命令类 + 系统 crontab 调用完成的。核心就两件事:写一个能跑通的命令,再让系统按时执行它。路径、权限、环境变量这三点最容易出错,得盯紧。
一、创建可执行的命令类
所有定时逻辑都封装在继承 think\console\Command 的 PHP 类里,必须放在 app/command/ 目录(注意全小写)。
- 推荐用命令生成骨架:php think make:command DailySync,会自动建好 app/command/DailySync.php
- configure() 方法里设命令名,比如 $this->setName('sync:order'),命名建议用“分组:动作”格式,方便管理
- execute(Input $input, Output $output) 方法里写真实业务,可直接调用 Db::table()、Log::info()、模型或服务类,和控制器写法一致
- 加一句 $output->writeln('Done at ' . date('Y-m-d H:i:s')); 是最简单的验证手段
二、本地测试必须做
别跳过这步——线上很多失败,本地就能发现。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 在项目根目录运行:php think sync:order(换成你的命令名)
- 观察控制台输出、检查数据库是否更新、日志是否写入
- 常见报错点:php -v 和网页用的 PHP 版本不一致;CLI 模式默认不读 .env,要确认数据库配置已生效;runtime 目录没写权限
三、配置 crontab 才算真正“定时”
Crontab 只认完整 shell 命令,不认 PHP 代码。一行规则 = 切目录 + 执行命令 + 记日志。
- 用 crontab -e 编辑当前用户计划任务
- 添加类似这行(每天凌晨2点执行):
0 2 * * * cd /var/www/myproject && /usr/bin/php think sync:order >> /var/www/myproject/runtime/log/cron.log 2>&1 - /usr/bin/php 必须是真实路径,用 which php 确认,不能只写 php
- cd /var/www/myproject 必须显式切换,否则 think 入口找不到配置和 runtime 目录
- 用 flock 防并发(尤其清理类任务):
* * * * * cd /var/www/myproject && flock -n /tmp/sync_order.lock -c '/usr/bin/php think sync:order >> /var/log/sync-order.log 2>&1'
四、验证是否真生效
光写进去不算数,得确认它动了。
- 执行 crontab -l,看刚加的那行是否完整显示
- 手动运行整条命令(去掉时间字段):cd /var/www/myproject && /usr/bin/php think sync:order,看是否报错、日志是否生成
- 实时跟踪日志:tail -f /var/log/sync-order.log 或系统级调度日志:tail -f /var/log/syslog | grep CRON
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










