Amazon Linux 2中从外部执行PHP脚本时db.php包含失败求助
问题原因与解决方案
问题根源
当你在/var/www/html目录外执行sudo php /var/www/html/xyz.php时,PHP的**当前工作目录(CWD)**是你执行命令时所在的目录,而非脚本xyz.php的存放目录/var/www/html。此时include('db.php')会尝试从当前工作目录加载文件,而非脚本所在目录,导致找不到db.php;后续数据库操作因为缺少连接对象,自然抛出Call to a member function query() on null的错误。
解决方案
1. 修改代码使用绝对路径加载(推荐)
把脚本中的include('db.php')替换为基于脚本目录的绝对路径:
include(__DIR__ . '/db.php');
__DIR__是PHP魔术常量,固定指向当前脚本文件所在的目录(这里就是/var/www/html),无论你在哪个目录执行脚本,都能正确找到db.php,从代码层面彻底解决路径问题。
2. 执行脚本前切换到目标目录
在cronjob或命令行中,先切换到/var/www/html再执行脚本:
sudo cd /var/www/html && php xyz.php
这样PHP的当前工作目录会变成脚本所在目录,include('db.php')就能正常加载文件。
3. 临时扩展include_path(可选)
执行脚本时通过命令行参数将/var/www/html加入include_path:
sudo php -d include_path=".:/usr/share/pear:/usr/share/php:/var/www/html" /var/www/html/xyz.php
这种方法让PHP在查找include文件时会遍历/var/www/html,但如果脚本中有多个相对路径的include,维护成本较高,不如前两种方法可靠。
内容的提问来源于stack exchange,提问作者coderatlarge
相关产品推荐
相关产品推荐

