Apache2服务器上PHP脚本无法通过Cronjob执行求助
看起来你遇到了典型的「手动运行正常但Cron定时任务失败」的环境差异问题,这种情况大多和相对路径、环境变量、权限这几个核心点有关,下面一步步帮你排查解决:
1. 先捕获Cron的错误输出,定位问题根源
Cron默认不会把错误信息输出到控制台,你根本不知道脚本卡在哪一步。先修改Cron任务,把所有输出重定向到日志文件:
*/3 * * * * /usr/bin/php /var/www/eve/processors/wallet.php >> /var/log/eve_wallet_cron.log 2>&1
等几分钟后查看/var/log/eve_wallet_cron.log,里面的错误提示会直接告诉你问题(比如找不到文件、权限不足、函数未定义等)。
2. 修复相对路径问题(最常见的元凶)
你的脚本里用了大量相对路径,比如../vendor/autoload.php、../processors/logs/wallet.log。手动运行时,你的工作目录是/var/www/eve/processors/,相对路径能正常解析;但Cron执行时,默认工作目录是执行用户的Home目录(比如/root/或/home/your-user/),这时候../vendor就完全不存在了。
解决方法选其一即可:
- 方法一:脚本开头强制切换工作目录
在<?php之后第一行添加:
chdir('/var/www/eve/processors/');
这样不管Cron的默认目录是什么,脚本都会先切换到正确的路径,所有相对路径就能正常识别。
- 方法二:把所有相对路径改成绝对路径
比如把:
include_once '../vendor/autoload.php'; include_once '../processors/commands.php'; $log->pushHandler(new StreamHandler("../processors/logs/wallet.log"));
改成:
include_once '/var/www/eve/vendor/autoload.php'; include_once '/var/www/eve/processors/commands.php'; $log->pushHandler(new StreamHandler("/var/www/eve/processors/logs/wallet.log"));
3. 检查PHP执行路径与环境变量差异
有时候Cron调用的PHP和你手动用的不是同一个版本,或者缺少必要的环境变量。先手动执行which php查看你正常使用的PHP路径,然后把Cron里的路径替换成这个:
# 先执行命令获取正确路径 which php # 假设输出是 /usr/local/bin/php,修改Cron任务 */3 * * * * /usr/local/bin/php /var/www/eve/processors/wallet.php >> /var/log/eve_wallet_cron.log 2>&1
如果还是有问题,可以在Cron任务开头加载用户的环境变量:
*/3 * * * * source ~/.bashrc && /usr/bin/php /var/www/eve/processors/wallet.php >> /var/log/eve_wallet_cron.log 2>&1
4. 排查权限问题
Cron执行的用户(比如你当前用户或root)需要具备以下权限:
- 读取脚本文件
/var/www/eve/processors/wallet.php的权限 - 读取
vendor、secret、processors目录下所有依赖文件的权限 - 写入
/var/www/eve/processors/logs/目录的权限(要生成wallet.log) - 数据库连接的权限(如果脚本用了特定数据库用户,Cron运行用户需要能正常建立连接)
你可以模拟Cron的用户身份手动运行脚本测试:
# 比如如果Cron用www-data用户执行 sudo -u www-data /usr/bin/php /var/www/eve/processors/wallet.php
如果报错,就针对性调整权限,比如给日志目录加写入权限:
chmod 755 /var/www/eve/processors/logs/ # 或者把目录归属改给www-data用户组 chown www-data:www-data /var/www/eve/processors/logs/
5. 确认Cron服务状态
最后检查Cron服务是否正常运行:
sudo systemctl status cron
如果没运行,启动并设置开机自启:
sudo systemctl start cron sudo systemctl enable cron
按照上面的步骤排查,大概率能快速定位问题——相对路径错误是最常见的原因,优先尝试切换工作目录或替换绝对路径,再结合Cron日志的错误提示针对性解决。
内容的提问来源于stack exchange,提问作者ACristian24

