90%的crontab执行php失败源于环境差异:需用绝对路径调用php、显式设置path、切换工作目录、加载.env、重定向日志并确保权限,而非脚本逻辑错误。

crontab里直接写php命令为什么总失败
90% 的问题不是脚本逻辑错,而是 crontab 运行环境和你终端不一致。它不加载 ~/.bashrc 或 ~/.zshrc,PATH 是极简的(通常只有 /usr/bin:/bin),php 命令根本找不到,或者调用的是系统自带的老版本。
- 先在终端运行
which php,拿到真实路径,比如/usr/local/bin/php或/opt/homebrew/bin/php—— crontab 里必须写这个绝对路径,不能只写php script.php - 在 crontab 文件顶部加一行:
PATH=/usr/local/bin:/usr/bin:/bin,避免后续依赖的curl、mysql等命令也失效 - 别信“我终端能跑,crontab 就该能跑”——手动执行一次完整命令:
/usr/local/bin/php /var/www/myapp/backup.php,看有没有 Parse error、Missing extension 或权限拒绝
phpEnv 下脚本读不到 .env 或 $_SERVER 变量
phpEnv 是本地开发环境(如 XAMPP、MAMP、Laragon 或自建 LAMP),默认没有预设 CLI 环境变量。脚本里如果依赖 $_SERVER['DOCUMENT_ROOT']、$_SERVER['REQUEST_METHOD'],或靠 Dotenv 自动加载 .env,在 crontab 里一跑就崩。
- 所有路径必须用绝对路径:
require '/var/www/myapp/config/database.php',而不是require 'config/database.php' - 在脚本开头强制切工作目录:
chdir(__DIR__);,否则file_get_contents('config.json')会去/root或/下找 - 显式加载环境变量:用
Dotenv\Dotenv::createImmutable(__DIR__)->load();,别依赖框架自动触发;或者改用getenv('DB_HOST') ?: 'localhost'并确保 crontab 条目里没漏掉export APP_ENV=production
日志空白、任务静默失败怎么办
crontab 默认把 stdout/stderr 丢进黑洞,连语法错误都看不到。很多“没执行”其实是执行了但崩在第一行。
- 每条 crontab 规则末尾必须加日志重定向:
> /var/log/mytask.log 2>&1,不是> /dev/null 2>&1 - 日志路径得保证 cron 运行用户有写权限:
ls -l /var/log/mytask.log,如果属主是root而 cron 是以www-data身份跑的,就得sudo chown www-data:www-data /var/log/mytask.log - 临时调试时,把日志指向
/tmp/cron-debug.log,再手动执行一遍相同命令,对比输出是否一致
Mac 上用 phpEnv(如 MAMP)配 crontab 的特殊坑
MAMP 自带的 PHP 通常装在 /Applications/MAMP/bin/php/php8.2.12/bin/php 这类深路径下,而系统 which php 返回的是 /usr/bin/php —— 它俩完全不是一回事。
- 进 MAMP GUI,点 “Preferences → PHP”,记下显示的 PHP 版本号,然后去对应路径确认是否存在:
ls -l /Applications/MAMP/bin/php/php*/bin/php - crontab 条目里必须用 MAMP 的完整路径,例如:
0 3 * * * /Applications/MAMP/bin/php/php8.2.12/bin/php /Users/you/project/artisan schedule:run >> /Users/you/project/storage/logs/cron.log 2>&1 - Mac 的 cron 有时受 SIP 或权限限制,如果死活不执行,试试用
launchd替代(但 crontab 本身没问题的话,优先修 crontab)
真正卡住人的从来不是 cron 表达式怎么写,而是 PHP 解释器路径对不对、当前目录在哪、环境变量有没有、日志往哪写——这四点没对齐,再准的 0 2 <em> </em> * 也是摆设。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











