tl; dr:如何从当前文件的角度使PHP解释include / require语句中的相对路径?
这是关于PHP中关于相对路径的旧问题的另一个问题。请耐心等待,因为我无法找到任何我特别想要的解决方案。
考虑以下目录树和文件:
[www]:
index.php
config.php
[webroot]:
home.php
index.php
需要在home.php
内找到webroot
:
require('webroot/home.php');
home.php
需要config.php
,可在父目录中找到:
require('../config.php');
我的问题是,这不适用于我的本地开发环境(Ubuntu 14.04 LTS / 15.10),而它在生产中运行完美。每个提到的环境都运行Apache 2和PHP 5 奇怪的是,当我在我的Vagrant VM(Ubuntu 12.04 LTS)中运行它时,它会在本地运行,从主机访问它。但是,现在,我无法在这里运行VM。
那么,为什么这些环境表现得如此不同呢?
这让我相信必须有一种方法来改变PHP如何解释相对路径。我目前正在使用一个6GB + PHP项目,就像上面的例子一样,我真的需要避免我需要花费大量精力来重写每个include / require语句(使用dirname(__FILE__)
左右),以及此可能导致的git合并冲突。
编辑:我刚才记得我其实在这里问了这个问题:PHP: include inside included file
答案 0 :(得分:5)
用于解析此类相对URL的路径由the include_path
configuration option配置,set_include_path
具有在运行时设置它的专用函数:chdir
。
请注意,要搜索的路径集可能包含.
,表示“当前工作目录”,可以使用getcwd
设置并使用{{3}}进行读取。您可能还需要对其进行更改,以明确显示./foo.php
和../foo.php
等相对路径。
(我建议您使用__DIR__
或$_SERVER['DOCUMENT_ROOT']
代替,但是您提到您不想重写现有代码。我仍然建议其他人阅读此内容以明确在每个包含路径相对的位置,以避免奇怪的错误和动态基础的潜在安全漏洞。)
答案 1 :(得分:2)
如果您要覆盖现有功能,则需要安装external library或使用namespaces。两者都是额外的工作。我猜测安装一个额外的库可能甚至不是一个选项。
您可以尝试使用set_include_path添加这些文件夹的路径。
或者你可以为所有require和include重载添加一个全局变量和几个全局函数,如下所示,但你仍然需要在整个项目中查找/替换include,require,include_once,require_once的实例......并用“include_rel”替换它们......
$include_rel_path = '.';
function include_rel($path){
global $include_rel_path;
$my_path = $include_rel_path;
//TODO maybe need to check for drive letters?
if(strpos($path, '/') === 0) { //absolutepath
$include_rel_path = preg_replace('/\/[^\/]*$/','',$path);
include($path);
} else { //relative path
$include_rel_path .= preg_replace('/\/[^\/]*$/','',$path);
include($my_path.'/'.$path);
}
$include_rel_path = $my_path;
}
答案 2 :(得分:1)
您必须使用auto_prepend_file。如果PHP作为Apache模块运行,则.htaccess文件到config.php
文件的路径,并且访问的任何PHP文件都会自动将配置文件的内容添加到其前面。
.htaccess
:
php_value auto_prepend_file /full/path/to/file/config.php
如果你的服务器使用的是CGI,那么在你的php.ini中设置这个指令,或者记住,这只适用于服务器,如果PHP作为CGI运行,你需要在php.ini
中添加编辑它将文件放入.user.ini
文件中,而不是php_value
部分。
auto_prepend_file /full/path/to/file/config.php
在Nginx
中,您可以将此行添加到location ~ \.php$
fastcgi_param PHP_VALUE "auto_prepend_file=/full/path/to/file/config.php";
如果我们没有解决您的问题,请告诉我。
答案 3 :(得分:1)
<?php
$path = $_SERVER['DOCUMENT_ROOT'];
$path .= "/Folder/File.php";
include_once($path);
?>
应该这样做:)
答案 4 :(得分:-1)
的index.php:
chdir('webroot');
require_once('home.php');