PHP本身无定时调度能力,必须依赖Linux Crontab定期调用独立PHP CLI脚本;脚本需脱离Web环境、用绝对路径、加Shebang、设执行权限,并在crontab中指定PHP绝对路径及日志重定向。

PHP本身不带定时调度能力,必须靠Linux的Crontab来驱动自动化执行。核心就一点:用crontab定期调用独立运行的PHP CLI脚本,所有业务逻辑封装在脚本里,系统只管按时“敲门”。
编写可被Crontab直接执行的PHP脚本
脚本要脱离Web环境独立运行,不能依赖$_SERVER、$_GET或session_start()。重点注意三件事:
- 所有文件路径必须写绝对路径,比如require '/var/www/myapp/config/database.php';,别用./config.php或../config.php
- 开头加Shebang(推荐):#!/usr/bin/env php,这是告诉系统“用php解释器跑我”
- 给脚本加执行权限:chmod +x /var/www/myapp/cron/backup.php
用crontab添加任务规则
执行crontab -e编辑当前用户任务表,一行一条规则。格式是:分 时 日 月 周 命令。关键细节:
- 务必用which php查清PHP解释器真实路径,例如/usr/bin/php,不要直接写php
- 命令部分建议写成:/usr/bin/php /var/www/myapp/cron/backup.php
- 如果脚本需要在项目根目录下运行(比如依赖vendor/autoload.php),改成:cd /var/www/myapp && /usr/bin/php think cron:run
- 示例:每天凌晨2点执行备份:0 2 * * * /usr/bin/php /var/www/myapp/cron/backup.php
必须加日志重定向,否则失败你根本不知道
Crontab默认把输出发邮件,但多数服务器没配邮件服务,结果就是静默失败。正确做法是把标准输出和错误都写进日志文件:
- 追加到日志:>> /var/log/backup.log 2>&1
- 完整示例:0 2 * * * /usr/bin/php /var/www/myapp/cron/backup.php >> /var/log/backup.log 2>&1
- 日志文件所在目录要确保PHP进程有写权限,比如:chown www-data:www-data /var/log/backup.log
常见踩坑点和验证方法
配置完别急着等明天,立刻动手验证是否真能跑通:
- 手动执行一次:/usr/bin/php /var/www/myapp/cron/backup.php,看有没有报错、日志有没有写入
- 检查crontab是否生效:crontab -l,确认刚加的那行还在
- 查看系统cron日志(Ubuntu/Debian):sudo tail -f /var/log/syslog | grep CRON,看有没有执行记录
- 权限问题最常见:确保runtime/目录(ThinkPHP)或cache/目录可写,否则脚本中途退出无提示
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











