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:包含内部包含的文件
用于解析此类相对URL的路径由配置选项配置,该include_path
选项具有在运行时设置它的专用功能:set_include_path
.
注意,要搜索的路径集可以包括.
,表示"当前工作目录",其可以设置chdir
和读取getcwd
.您可能还需要更改此选项以明确表示相对路径./foo.php
和../foo.php
工作方式.
(我打算建议你使用__DIR__
或$_SERVER['DOCUMENT_ROOT']
代替,但你提到你不想重写现有的代码.我仍然建议其他人阅读这个以明确在每个包含路径相对的地方,以避免奇怪的错误和动态基础的潜在安全漏洞.)