PHP相对路径:我可以配置它吗?
tl;dr:如何让PHP从当前文件的角度解释include/require语句中的相对路径 这是PHP中关于相对路径的老问题的另一个问题。请容忍我,因为我找不到任何解决方案,我特别想做的事 考虑以下目录树和文件:PHP相对路径:我可以配置它吗?,php,apache,relative-path,Php,Apache,Relative Path,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需要
[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)中不起作用,而它在生产环境中运行得完美无缺。提到的每个环境都在运行Apache2和PHP5。奇怪的是,当我在我的Vagrant VM(Ubuntu12.04 LTS)中运行它,并从主机访问它时,它确实在本地运行。但是,现在,我不能在这里运行VM 那么,为什么这些环境的行为如此不同呢?
这让我相信一定有办法改变PHP解释相对路径的方式。我目前正在处理一个6GB+PHP项目,该项目的编写方式与上面的示例类似,我确实需要避免重写每个include/require语句(使用
dirname(\uu FILE\uu)
等等)以及可能导致的git合并冲突
编辑:我刚刚记得我实际上已经在这里问过这个问题:用于解析类似这样的相对URL的路径是由配置的,它有一个专门的函数用于在运行时设置它: 请注意,要搜索的路径集可能包括表示“当前工作目录”的
,可以使用设置和读取该目录。您可能还需要对此进行更改,以使像/foo.php
和/foo.php
这样的显式相对路径起作用
(我打算建议您使用\uuuuu DIR\uuuuu
或$\u服务器['DOCUMENT\u ROOT']
相反,但您提到您不想重写现有代码。我仍然建议阅读本文的任何其他人在每个包含中明确说明路径的相对位置,以避免奇怪的错误和动态基的潜在安全漏洞。)index.php:
chdir('webroot');
require_once('home.php');
如果要覆盖现有功能,则需要安装或使用。两者都是额外的工作。我猜安装一个额外的库甚至可能不是一个选项 您可以尝试使用将路径添加到这些文件夹 或者,对于所有require和include重载,您可以添加一个全局变量和几个如下的全局函数,但对于include、require、include\u once、require\u once等实例,您仍然需要在整个项目中进行查找/替换。。。并将其替换为“include_rel” 你必须使用。如果PHP作为Apache模块运行,则指向
config.PHP
文件路径的.htaccess文件和任何被访问的PHP文件都会自动将配置文件的内容添加到它前面
对于.htaccess
:
php_value auto_prepend_file /full/path/to/file/config.php
如果您的服务器使用CGI,则在php.ini中设置此指令,或者请记住,这仅适用于以下服务器:如果php作为CGI运行,则需要将其添加到php.ini
文件中进行编辑,或者将其放入.user.ini
文件中,而不包含php\u值
部分
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";
如果无法解决您的问题,请告诉我。
<?php
$path = $_SERVER['DOCUMENT_ROOT'];
$path .= "/Folder/File.php";
include_once($path);
?>
这就应该做到了:)如果你有6GB以上的PHP代码,你就做错了。或者,该代码是机器从某个编译时模板生成的,更改模板会更改所有文件。@IMSoP这是一个4年的git项目。但是当前的代码库有多大?您不需要重写所有历史记录,因此减去
.git
文件夹的大小。即使这样,我也怀疑是否有那么多实际的代码,其中大概有一些图像和东西。整个Linux内核只解压缩了约600MB(52000个文件)。尽管如此,我还是回答了你提出的问题。(顺便提一下,如果你想测量PHP的实际大小,你可以使用find path/to/project-type f-name'*.PHP'-print0 | du-ch--files0 from=-
;或者更相关的是,有多少PHP文件:find path/to/project-type f-name'*.PHP'| wc-l
)总共93M,在7756个文件中。是的,我不必编辑这7756个文件中的每一个,但如果PHP设计得不那么糟糕的话,我仍然可以工作几个小时:(您好,谢谢您的时间。我刚刚尝试在PHP.ini中添加include\u path=“.”“
,并添加一个set\u include\u路径(get\u include\u path().path\u分隔符)。”
删除项目中的一个关键文件,但它仍然会给我同样的错误。你认为我遗漏了什么吗?@GuiImamura你是否尝试过回显getcwd()
?
与\uu DIR\uuu
并不意味着相同的事情,它与编写include的文件无关;它是“当前工作目录”,就像在shell中使用cd
导航时一样。getcwd()
为我提供了项目的根目录,而不是我写入getcwd
的文件的路径。是否有一种方法可以在每次我包含/需要时将其更改为当前文件?正如我在回答中所说,您使用chdir
设置了工作目录。但是,值得检查工作服务器上的设置(echo-get\u include\u path()
和echo-getcwd()
),并使事情与之匹配,因为除非有魔法发生在那里以保持工作目录的更改,否则您也不需要在新服务器上使用魔法。@GuiImamura就像我说的,您的工作服务器已经在运行了
<?php
$path = $_SERVER['DOCUMENT_ROOT'];
$path .= "/Folder/File.php";
include_once($path);
?>