必须使用PHP绝对路径并锁定工作目录:cron环境PATH与终端不同,需用whereis或find查真实路径(如/usr/bin/php),脚本首行加#!/usr/bin/php -f并chdir(__DIR__),显式设时区、内存限制,重定向日志,检查cron服务与权限。

确认PHP CLI是否可用且路径正确
很多定时任务失败,第一步就卡在找不到 php 命令。Cron环境的 $PATH 和你登录终端时完全不同,它通常不包含 /usr/local/bin 或自定义PHP安装路径。
别依赖 which php 的结果直接写进 crontab —— 那是你的交互式 shell 环境,不是 cron 的。必须用绝对路径。
- 执行
whereis php或find /usr -name php 2>/dev/null查找真实位置,常见路径有:/usr/bin/php、/usr/local/bin/php、/opt/php/bin/php - 验证该路径是否真能执行脚本:
/usr/bin/php -v(应输出版本号) - 如果 PHP 是编译安装的,确保
bin/目录已加入系统 PATH 或直接使用全路径
编写可被 cron 安全调用的 PHP 脚本
脚本本身没问题,不等于 cron 能跑通。常见问题:相对路径失效、工作目录错乱、扩展缺失、超时中断。
- 开头加
#!/usr/bin/php -f(注意-f参数,不是-q;-f显式指定文件,兼容性更好) - 脚本内第一行就用
chdir(__DIR__);锁定工作目录,避免include或数据库配置路径出错 - 显式设置时区:
date_default_timezone_set('Asia/Shanghai');,cron 不继承用户 shell 的 TZ - 如需长时间运行,加
set_time_limit(0);和ini_set('memory_limit', '512M'); - 不要依赖
$_SERVER变量(如$_SERVER['DOCUMENT_ROOT']),cron 下为空
编辑 crontab 并避免权限与环境陷阱
crontab -e 看似简单,但默认编辑器(vi/nano)、保存方式、语法错误都会导致任务静默失效。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
立即学习“PHP免费学习笔记(深入)”;
- 首次运行
crontab -e时,若弹出编辑器选择,选nano(更友好);保存用Ctrl+O → Enter → Ctrl+X - 每行格式严格为:
分钟 小时 日期 月份 星期几 命令,五段时间后**必须有一个空格**再跟命令,多一个 tab 或少一个空格都无效 - 务必重定向输出,否则错误会丢进黑洞:
*/5 * * * * /usr/bin/php /var/www/cron/backup.php >> /var/log/cron_backup.log 2>&1 - 如果脚本需访问 Web 目录下的资源(如上传文件、缓存),确保 cron 执行用户(如
www-data或apache)对该路径有读写权限 - 测试时先设成每分钟执行:
* * * * * ...,确认日志有输出后再调回真实周期
验证 cron 是否真正加载并排查静默失败
任务写进 crontab ≠ 系统正在执行。cron 守护进程可能没启动,或规则语法错误被忽略,或 SELinux/AppArmor 拦截了 PHP 调用。
- 检查 cron 服务状态:
systemctl status cron(Debian/Ubuntu)或systemctl status crond(CentOS/RHEL) - 查看 cron 日志:
grep CRON /var/log/syslog(Ubuntu)或journalctl -u cron -n 50(systemd 系统) - 手动模拟 cron 环境执行一次:
env -i HOME=$HOME PATH=/usr/bin:/bin /usr/bin/php /var/www/cron/backup.php—— 这比直接php xxx更接近真实场景 - 如果脚本中用了
exec()、shell_exec()或调外部命令(如mysqldump),确保这些命令也在 cron 的$PATH中,或改用绝对路径(如/usr/bin/mysqldump)
最易被忽略的一点:cron 默认以 用户主目录为工作目录,而不是脚本所在目录,也不是 Web 根目录。哪怕你 crontab 里写了 /var/www/cron/task.php,PHP 内部的 <strong>DIR</strong> 仍是 /home/username —— 所以 chdir(<strong>DIR</strong>) 不是可选项,是必选项。


















