PHP定时任务不执行的根本原因在于系统级配置缺失:cron服务未运行、PHP未用绝对路径、环境变量与工作目录不匹配、日志路径权限不足;须先确认crond/cron服务active,再用绝对路径调用PHP并显式设PATH、chdir、重定向日志。

PHP定时任务不执行,通常不是代码本身的问题,而是系统级调度或环境配置没到位。AI查日志报错只是表象,真正要盯住的是 cron 是否真正触发了脚本、脚本执行环境是否和命令行一致、日志权限与路径是否正确。
检查 cron 是否真的在跑
很多人以为加了 crontab 就万事大吉,其实 cron 服务可能没启动,或者用户 crontab 没生效:
- 运行 sudo systemctl status cron(Ubuntu/Debian)或 sudo systemctl status crond(CentOS/RHEL),确认服务是 active (running)
- 用 crontab -l 查看当前用户的定时任务,注意别误编辑了 root 的 crontab 却用普通用户身份测试
- 在 crontab 里加一行测试: * * * * * date >> /tmp/cron-test.log 2>&1,等一分钟看文件有没有追加时间戳
确保 PHP 脚本能被 cron 正确调用
cron 使用的 shell 环境极简,PATH、PHP 路径、工作目录都和你终端不一样:
- 写绝对路径:不要用 php script.php,改用 /usr/bin/php /var/www/project/artisan schedule:run(Laravel)或 /usr/bin/php /path/to/your/script.php
- 显式指定 SHELL 和 PATH:在 crontab 开头加上 SHELL=/bin/bash 和 PATH=/usr/local/bin:/usr/bin:/bin
- cd 到项目目录再执行(尤其依赖 autoload 或 .env 的脚本):* * * * * cd /var/www/project && /usr/bin/php artisan schedule:run >> /var/log/laravel-schedule.log 2>&1
日志写入失败?权限和路径是关键
AI 报“无法写入日志”、“Permission denied”,大概率是 cron 以 www-data 或 nobody 用户运行,但日志目录属于 root 或其他用户:
立即学习“PHP免费学习笔记(深入)”;
- 检查日志路径父目录权限:ls -ld /var/log/myapp,确保运行 cron 的用户(如 www-data)有写权限
- 避免写到 /root/、/home/xxx/ 这类非共享路径——cron 用户通常无权访问
- 临时把日志输出到 /tmp/ 测试(如 >> /tmp/php-cron.log 2>&1),确认是不是权限问题
- 用 tail -f /var/log/syslog | grep CRON 查看系统级 cron 执行记录,能看到是否报 command not found 或 permission denied
PHP 脚本内部出错?别只信 AI 解析
AI 基于日志文本推理,但有些错误根本不会打到日志里(比如语法错误、require 失败、exit 提前终止):
- 在脚本开头加 error_log("Script started at " . date('Y-m-d H:i:s') . "\n", 3, "/tmp/php-cron-debug.log");,确认是否真被执行
- 加上 ini_set('display_errors', 1); error_reporting(E_ALL); 并重定向 stderr,让所有错误进日志
- 如果用 Laravel/Symfony,确保 APP_ENV=production 下也开启了日志通道,且 storage/logs/ 可写
- 用 /usr/bin/php -l your_script.php 检查语法;用 /usr/bin/php -m 确认 curl/json/mbstring 等扩展已启用



















