在ThinkPHP6中配置Linux crontab定时任务,应使用绝对PHP路径每分钟执行schedule:run命令触发单次调度检查,并确保runtime目录权限正确、日志重定向可查。

在 ThinkPHP6 中配置 Linux crontab 定时任务,核心不是让 cron 反复启动守护进程,而是用 schedule:run 命令触发单次调度检查。常见失败不是代码写错,而是环境、路径、权限三处没对齐。
确认并使用绝对 PHP 路径
crontab 不读取你的 ~/.bashrc,默认 PATH 极其有限(通常只有 /usr/bin:/bin),而你手动执行时用的 php 很可能在 /usr/local/bin/php 或其他位置。
- 先在终端运行
which php,记下完整路径,例如/usr/local/bin/php - crontab 条目中必须写死这个路径,不能只写
php - 如果命令里还调用了
mysql、curl等,也建议用which查明路径,避免半途报错
用 schedule:run 替代 timer:run
TP6 的 timer:run 是常驻进程模式,cron 每次新建 shell 启动后就退出,根本起不到定时效果;正确方式是让 cron 每分钟调用一次 schedule:run,由它判断当前是否有待执行的任务。
- 确保已按官方方式定义好自定义命令(如
php think make:command SendNotice)并注册到config/console.php - 在项目根目录下测试:运行
/usr/local/bin/php think schedule:run,应能看到“Running scheduled command…”等输出 - 该命令不依赖当前工作目录,但为保险起见,建议在 crontab 中显式
cd到项目根目录
设置 runtime 目录与权限
TP6 默认把日志、缓存写入 runtime/,但 cron 以系统用户(如 www-data 或 root)运行,容易因路径解析错误或权限不足导致静默失败。
立即学习“PHP免费学习笔记(深入)”;
- 在
config/app.php中显式指定绝对路径:'runtime_path' => '/var/www/yourapp/runtime/', - 确保该目录属主和属组为 cron 执行用户,例如:
chown -R www-data:www-data /var/www/yourapp/runtime - 赋予写权限:
chmod -R 755 /var/www/yourapp/runtime(或更严格地仅 750)
添加日志重定向并验证执行
没有日志等于盲调。crontab 默认不输出任何内容,必须手动重定向才能排查问题。
- 编辑 crontab:
crontab -e - 添加一行(替换为你的实际路径):
* * * * * cd /var/www/yourapp && /usr/local/bin/php think schedule:run >> /var/www/yourapp/storage/logs/schedule.log 2>&1 - 保存后等待一分钟,立即检查日志文件是否存在、是否可写、是否有新内容
- 若日志为空,先运行
systemctl status cron确认服务正常,再手动执行该行命令看是否报错



















