set_include_path()不使用相对require()

时间:2016-03-10 06:33:45

标签: php

我是"要求"一个具有自己的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 中的代码。

有没有办法让这项工作?

2 个答案:

答案 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将执行您传递给它的任何代码,并在执行之前执行所需的更改。