我是"要求"一个具有自己的require()调用的文件。但是调用set_include_path()不能使用require()中的相对路径。不幸的是,我无法控制所需的代码文件。
C:/myapp/index.php - 我的代码
set_include_path(get_include_path() . ';C:/app/subfolder');
require('C:/app/subfolder/index.php');
C:/app/subfolder/index.php - 第三方代码(无控件)
require('../config.php'); // Require file located at C:/app/config.php
结果:
需要打开失败' ../ config.php' (包含路径=' C:/应用/子文件夹&#39)
即使C:/ app /子文件夹位于包含路径中,这也不起作用。我希望../config.php是C:/ app / subfolder /../ config.php。也许我没有正确地做到这一点。
在这种情况下,C:/app/subfolder/index.php最初从未打算包含在另一个PHP文件中。但是,我正在构建代码,我希望C:/app/subfolder/index.php仍然能够要求/包含文件,就好像它从未离开过它的位置一样。
我已经读过使用dirname()或__DIR__修复了require(),中的相对路径问题,但是我无法更改C:/app/subfolder/index.php 中的代码。
有没有办法让这项工作?
答案 0 :(得分:3)
您的问题与set_include_path()
范围无关。您的致命错误也显示实际include_path
,您可以在其中看到添加的路径。
问题是../
调用不会查看include_path
,而是查看当前工作目录。通过HTTP URL调用脚本很难理解,但如果可以通过命令行调用脚本则更清楚。
如果你在/usr/angelina/myproject/subfolder/index.php
写这个脚本(注意:在这个解释性的例子中,我将使用Unix filePath /命令):
set_include_path( '/usr/angelina/myproject/subfolder' );
require( '../config.php' );
然后,在终端中,你写道:
cd /usr/angelina/myproject/subfolder
php index.php
脚本将被执行正常。但如果你写:
cd /usr/angelina/myproject
php subfolder/index.php
脚本将失败,即使在您调用的同一脚本中设置了包含路径。
上面的示例解释您的问题不是包含路径,而是当前工作目录。要解决您的问题,您必须使用chdir()
更改当前目录。
所以,在C:/myapp/index.php
你必须写:
chdir( 'C:/app/subfolder' );
require( 'C:/app/subfolder/index.php' );
你的脚本会起作用(或者,至少:在我这边有效......)
答案 1 :(得分:0)
通过使用PHP的eval()
函数与file_get_contents()
和str_replace()
混合,您可以实现此目的:
<?php
$index = file_get_contents("C:/app/subfolder/index.php");
if (substr($index, 0, 5) == "<?php") $index = trim(substr($index, 5));
elseif (substr($index, 0, 2) == "<?") $index = trim(substr($index, 2));
if (substr($index, -2) == "?>") $index = trim(substr($index, 0, -2));
$index = str_replace("require('../config.php');", "require('C:/app/config.php');", $index);
eval($index);
?>
发生了什么事?
PHP中的eval函数将任何以字符串形式提供的代码作为字符串执行。上面发生的事情是在使用str_replace()
更改所需路径后,eval()
将文件"C:/app/subfolder/index.php"
的内容作为字符串传递,并删除了PHP打开和关闭标记以避免错误。结果是PHP将执行您传递给它的任何代码,并在执行之前执行所需的更改。