PHP的require/include在CLI/CRON中无报错终止脚本问题
你遇到的是典型的CLI/CRON环境与Web环境差异导致的脚本异常终止——虽然is_readable和file_exists都返回1,但require操作触发了致命错误,只是CLI默认不显示错误信息,才让你看不到后续输出。下面是一步步的排查和解决方法:
1. 先开启错误输出,定位具体问题
CLI环境的错误报告配置通常和Web环境不同,默认可能隐藏致命错误。在脚本开头添加以下代码,强制显示所有错误:
error_reporting(E_ALL); ini_set('display_errors', 1); ini_set('error_log', '/tmp/php_cli_errors.log'); // 可选,把错误写入日志方便查看
重新执行脚本(或等待cron运行),你就能看到require时触发的具体错误,这是解决问题的核心突破口。
2. 最常见原因:相对路径失效
WordPress的wp-load.php内部会用相对路径引用其他核心文件(比如wp-config.php),但CLI/CRON的默认工作目录并不是你的网站根目录/var/www/docroot(比如cron默认工作目录是执行用户的主目录,比如/root),导致wp-load.php找不到依赖文件,触发致命错误终止脚本。
解决方法是在require之前切换到网站根目录:
echo "1 - is_readable: " . is_readable("/var/www/docroot/wp-load.php") . "\n"; echo "2 - file_exists: " . file_exists("/var/www/docroot/wp-load.php") . "\n"; echo "3 - before require\n"; // 切换到wp-load.php所在的目录 chdir("/var/www/docroot"); // 现在用相对路径或绝对路径require都可以 require("wp-load.php"); echo "4 - after require\n";
3. 检查PHP环境差异
CLI和Web服务器可能使用不同的php.ini配置,比如:
- 某些WordPress依赖的扩展(如
mysqli、curl)在CLI环境中未加载 open_basedir限制阻止了PHP访问某些路径- 内存限制过低导致脚本终止
可以通过以下命令导出CLI的PHP配置,和Web环境的phpinfo()输出对比:
php -i > /tmp/cli_php_info.txt
找到差异后调整CLI的php.ini配置即可。
4. 权限与SELinux问题
虽然你用root用户执行cron,但SELinux可能会阻止root访问Web服务的文件上下文。如果错误信息提示权限相关问题,可以先尝试修复文件的SELinux上下文:
restorecon -Rv /var/www/docroot
5. 确保使用正确的PHP版本
有些服务器会安装多个PHP版本,php命令可能指向和Web环境不同的版本。在cron任务中指定PHP的绝对路径,比如:
*/1 * * * * root /usr/bin/php -f /mypath/fetch_data.php >> /mypath/results.out.log 2>&1
可以用which php命令找到正确的PHP路径。
内容的提问来源于stack exchange,提问作者Alexander Z

