PHP嵌套文件包含报错:仅修改innerRunner.php如何解决?
问题解决:PHP相对路径引入文件报错
问题场景
项目文件结构:
\+-- config | +-- config1.php | +-- config2.php \+-- test | +-- test1 | +-- innerRunner.php \+-- outerRunner.php
各文件代码:
- config1.php:
<?php require_once 'config/config2.php';
- config2.php:
<?php function runConfig2(){ echo "control in config2"; } runConfig2();
- innerRunner.php(原代码):
<?php require_once("../../config/config1.php");
- outerRunner.php:
<?php require_once("config/config1.php");
运行outerRunner.php正常,但运行innerRunner.php时出现错误:
Warning: require_once(config/config2.php): Failed to open stream: No such file or directory in /var/www/config/config1.php on line 2 Fatal error: Uncaught Error: Failed opening required 'config/config2.php' (include_path='.:/usr/local/lib/php') in /var/www/config/config1.php:2 Stack trace: #0 /var/www/test/test1/innerRunner.php(2): require_once() #1 {main} thrown in /var/www/config/config1.php on line 2
限制条件:无法修改config1.php或config2.php,仅能修改innerRunner.php
问题原因
PHP中相对路径的解析是基于当前执行脚本的工作目录,而非被包含脚本所在的目录。运行innerRunner.php时,工作目录为/var/www/test/test1/,config1.php里的require_once 'config/config2.php';会尝试在/var/www/test/test1/config/config2.php查找文件,该路径不存在,因此报错。
解决方案
修改innerRunner.php,切换当前工作目录到项目根目录后再引入config1.php:
<?php // 切换到项目根目录(/var/www/) chdir(dirname(__DIR__, 2)); require_once("config/config1.php");
代码解释
__DIR__表示当前脚本(innerRunner.php)所在的目录/var/www/test/test1/dirname(__DIR__, 2)表示向上回溯2级目录,得到项目根目录/var/www/chdir()切换工作目录到根目录后,config1.php里的相对路径会基于根目录解析,和outerRunner.php运行时的环境一致,就能正确找到config2.php
内容的提问来源于stack exchange,提问作者Naman Jain
相关产品推荐
相关产品推荐

