PHP包含绝对路径
Posted
技术标签:
【中文标题】PHP包含绝对路径【英文标题】:PHP include absolute path 【发布时间】:2014-05-19 16:17:05 【问题描述】:我的网站上有一个名为 $basePath 的变量,它设置为:
$basePath = '/Systems/dgw/';
我在我所有的 css、js 和图像标签上都使用它(为了更好的可见性而缩短):
<link href="<?php echo $basePath; ?>include/assets/css/bootstrap.min.css">
我对这些包含没有任何问题,它们在任何文件和我所在的任何文件夹中都可以正常工作。
我有一个包含以下内容的页面:
<img src="<?php echo $basePath; ?>images/new_logo.png" />
而且图像显示得很好。它后面的行是:
<?php include($basePath.'include/assets/common/topMessages.php');?>
但包含不会发生。当我这样尝试时:
<?php include('../../include/assets/common/topMessages.php');?>
有效。
有人知道哪里出了问题吗?
【问题讨论】:
echo
没有包含任何东西……
抱歉,复制了错误的行。固定。
基本上,您的 webroot (即www.example.com/
是您网站的根)和(unix)文件系统的根之间存在区别。 webroot 映射到文件系统中的路径;通常www.example.com/
被映射到类似/var/www/example.com/http_docs/
的东西。您的网络服务器会自动将任何对/a/b/c
的请求转换为/var/www/example.com/http_docs/a/b/c
。但是,当您通过 PHP 包含文件时,不会要求网络服务器转换路径,因此它会在您的文件系统中查找 /a/b/c
,这显然不存在。
【参考方案1】:
你不能这样包含相对于你的 webroot 的 php 文件,因为如果你使用斜杠作为第一个字符,引用将比你的文档根目录更深入。因此,您可以执行以下操作,而不是使用基本路径:
<?php
$path = $_SERVER['DOCUMENT_ROOT'];
$path .= "/yourpath/yourfile.php";
include_once($path);
?>
【讨论】:
【参考方案2】:如果你的服务器没有填充“document_root”,你可能需要这个
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");
我使用这行代码。它返回到站点树的“顶部”,然后转到所需的文件。 例如,假设我有这个文件树: domain.com/aaa/index.php domain.com/bbb/ccc/ddd/index.php domain.com/_resources/functions.php 无论我身在何处,我都可以通过复制粘贴来包含 functions.php 文件
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");
如果你需要多次使用这段代码,你可以创建一个函数,返回 "str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/') -1))”部分。然后只需将此函数插入到您包含的第一个文件中。我有一个“initialize.php”文件,我包含在每个 php 页面的最顶部,其中包含此函数。下次我必须包含文件时,实际上我只是使用该函数(名为“path_back”):
require(path_back()."/_resources/another_php_file.php");
【讨论】:
很好的解决方案!但对于根级别的文件失败。【参考方案3】:您可以将include_path = ".:/home/myuser/mysite.com/"
添加到您的php.ini
,或者您可以在include
或require
之前将类似的内容添加到您的脚本中:
set_include_path(get_include_path() . ":/home/myuser/mysite.com/");
第一个适用于您网站中运行的所有脚本。
第二个选项仅适用于代码中包含setincludepath
的脚本,对于应用程序的其余部分,除非您在每个添加了setincludepath
的脚本中调用了一个对象,否则它将不起作用。
【讨论】:
以上是关于PHP包含绝对路径的主要内容,如果未能解决你的问题,请参考以下文章