我在PHP项目中有这样的文件夹结构。(如Eclipse所示)
-MySystem
+Code
+Data_Access
-Public_HTML
+css
+js
+Templates
-resources
当我尝试这段代码时
echo $_SERVER['DOCUMENT_ROOT']
输出结果为
D:/workspace
如何获取系统(MySystem
)的根目录路径,而不是硬编码文件夹名称?
我在PHP项目中有这样的文件夹结构。(如Eclipse所示)
-MySystem
+Code
+Data_Access
-Public_HTML
+css
+js
+Templates
-resources
当我尝试这段代码时
echo $_SERVER['DOCUMENT_ROOT']
输出结果为
D:/workspace
如何获取系统(MySystem
)的根目录路径,而不是硬编码文件夹名称?
当你说
$_SERVER['DOCUMENT_ROOT']
包含此路径:
D:/workspace
那么您需要的是 D:
,对吗?
如果是这种情况,您可以通过斜线分割字符串并返回第一个:
$pathInPieces = explode('/', $_SERVER['DOCUMENT_ROOT']);
echo $pathInPieces[0];
这将输出服务器的根目录。DIRECTORY_SEPARATOR
而不是硬编码斜杠('/'
)时,此代码在Windows下也可以运行。$_SERVER
并非始终可用。例如在命令行(cli)中。因此,您应该使用 __DIR__
替代 $_SERVER['DOCUMENT_ROOT']
。 __DIR__
返回php文件本身的路径。__DIR__
代替 $_SERVER['DOCUMENT_ROOT']
。 - Armin我想指向WordPress处理此事的方式:
define( 'ABSPATH', dirname( __FILE__ ) . '/' );
WordPress在Web上被广泛使用,也可以在本地运行良好,因此我非常信任这种方法。您可以在wordpress的wp-config.php
文件底部找到此定义。
dirname
实际上会剥离一个目录(可能不是那些来到这个线程的人想要的 -> 例如我)。 - 43matthew目前,PHP本身并没有提供一种确定获取项目根目录的方法。
但是您可以自己实现一个非常简单的方法,以确切地实现您想要的功能。
解决方案
在您的项目中创建一个新文件,比如说D:/workspace/MySystem/Code/FilesManager.php
(使用任何名称和路径都可以),然后使用以下代码:
<?php
class FilesManager
{
public static function rootDirectory()
{
// Change the second parameter to suit your needs
return dirname(__FILE__, 2);
}
}
现在你可以在这样的路径中执行此操作,比如说:D:/workspace/MySystem/Code/a/b/c/Feature.php
:
echo FilesManager::rootDirectory();
期望的结果应该是:
"D:/workspace/MySystem"
无论在项目中的哪个位置,输出将是相同的。
解释
使用dirname返回第一个参数的父目录。我们使用幻数常量 __FILE__
来给出FilesManager.php
文件的路径。第二个参数告诉我们在层次结构中向上移动的次数。在这种情况下,我们需要上移两次,但这实际取决于您将文件放在层次结构的什么位置。如果您只需要上移一次(即文件位于根目录中),则可以省略第二个参数。但是,此时可以直接返回__DIR__
。
这种解决方案保证可以工作,无论根目录在服务器上的何处。除非您最终将实用类移到其他位置。
补充说明
我建议避免使用DOCUMENT_ROOT,理由如下(根据这个答案):
dirname
的第二个参数帮了很大的忙。 - amir22dirname(__FILE__)
这是一个有用的函数,但它只会获取相对于当前文件URL的当前路径,如果您在其他远离根目录的目录中(例如,includes目录),并且您需要从根目录获取文件夹,则可以使用整数参数2来向上走1级,以此类推。
echo dirname(__FILE__, 2);
之前
C:\laragon\www\x\includes\reports\charts
之后
C:\laragon\www\x\reports\charts
“reports”是在根目录x中的文件夹。
$_SERVER['PATH_TRANSLATED']
引用:realpath(".")
返回你的文档根目录。$filepath = realpath(".") . "/path/to/newfile.txt";
希望这能帮到大家。realpath() [...] 解析对 /./、/../ 等的引用,并返回规范化的绝对路径名。
好吧,但是.
表示当前目录,所以如果将其作为参数传递,它如何被解析为根目录的当前目录?我错过了什么? - funder7echo $pathInPieces = explode(DIRECTORY_SEPARATOR , __FILE__);
echo $pathInPieces[0].DIRECTORY_SEPARATOR;
概要
本示例假定您始终知道 Apache 根目录的位置为 '/var/www/',并且您正在尝试查找下一个文件夹路径(例如 '/var/www/my_website_folder')。此外,这适用于脚本或 Web 浏览器,因此需要额外的代码。
PHP7 代码
function getHtmlRootFolder(string $root = '/var/www/') {
// -- try to use DOCUMENT_ROOT first --
$ret = str_replace(' ', '', $_SERVER['DOCUMENT_ROOT']);
$ret = rtrim($ret, '/') . '/';
// -- if doesn't contain root path, find using this file's loc. path --
if (!preg_match("#".$root."#", $ret)) {
$root = rtrim($root, '/') . '/';
$root_arr = explode("/", $root);
$pwd_arr = explode("/", getcwd());
$ret = $root . $pwd_arr[count($root_arr) - 1];
}
return (preg_match("#".$root."#", $ret)) ? rtrim($ret, '/') . '/' : null;
}
例子
echo getHtmlRootFolder();
输出:
/var/www/somedir/
详细信息:
基本上,首先尝试获取DOCUMENT_ROOT,如果它包含“/var/www/”,则使用它,否则获取当前目录(必须存在于项目内),并根据$root路径计数获取下一个路径值。注意:添加了rtrim语句以确保在所有情况下路径返回以“/”结尾。它不检查是否需要大于/var/www/,也可以返回/var/www/作为可能的响应。
__DIR__
的结果取决于它的使用位置。它是相对于文件本身的,所以如果在一个子目录的 include 文件中使用它,它将不会返回你的根目录。 - Iris