获取 PHP 项目的根目录路径

我在 PHP 项目中有这个文件夹结构。 (如下图所示)

-MySystem
+Code
+Data_Access
-Public_HTML
+css
+js
+Templates
-resources

当我尝试这个代码

echo $_SERVER['DOCUMENT_ROOT']

输出是

D:/工作区

如何在不硬编码文件夹名的情况下获取系统的 RootDirectory (MySystem)的路径?

518496 次浏览

你可以试试: $_SERVER['PATH_TRANSLATED']

引用:

在服务器完成任何虚拟到实际的映射之后,基于文件系统(而不是文档根)到当前脚本的路径。注意: 在 PHP 4.3.2中,与 Apache 1中的情况相比,在 Apache 2 SAPI 中不再隐式设置 PATH_TRANSLATED,在 Apache 中,当没有填充 SCRIPT_FILENAME服务器变量时,PATH_TRANSLATED被设置为与 SCRIPT_FILENAME服务器变量相同的值。
进行此更改是为了遵守 CGI 规范,即 PATH _ TRANSLated 只有在定义了 PATH_INFO时才应该存在。Apache2用户可以在 httpd.conf中使用 AcceptPathInfo = On来定义 PATH_INFO

来源: Net/手册

PHP > = 5.3.0试试

PHP 魔法常数.

__DIR__

让你的道路相对。

PHP < 5.3.0试试

dirname(__FILE__)

你这么说的时候

$_SERVER['DOCUMENT_ROOT']

包含以下路径:

D:/workspace

那么 D:就是你要找的,不是吗? 在这种情况下,你可以用斜杠将字符串分开,然后返回第一个:

$pathInPieces = explode('/', $_SERVER['DOCUMENT_ROOT']);
echo $pathInPieces[0];

这将输出服务器的根目录。

更新: 当您使用常量 DIRECTORY_SEPARATOR而不是硬编码斜杠('/')时,这段代码也可以在 Windows 下工作。

更新2: $_SERVER全局变量并不总是可用。例如,在命令行(cli)上。因此,应该使用 __DIR__而不是 $_SERVER['DOCUMENT_ROOT']__DIR__返回 php 文件本身的路径。

使用 PHP 函数:

getcwd()

获取当前工作目录。

echo $pathInPieces = explode(DIRECTORY_SEPARATOR , __FILE__);
echo $pathInPieces[0].DIRECTORY_SEPARATOR;

我想指出 WordPress 处理这个问题的方式:

define( 'ABSPATH', dirname( __FILE__ ) . '/' );

由于 Wordpress 在网络上的使用量非常大,而且在本地也能很好地工作,因此我非常信任这种方法。您可以在 wordpress wp-config.php文件的底部找到这个定义

摘要

这个示例假设您总是知道 apache 根文件夹在“/var/www/”的位置,并且正在尝试查找下一个文件夹路径(例如“/var/www/my _ site _ file”)。这也是从脚本或网页浏览器的工作,这就是为什么有额外的代码。

代码 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 路径的计数获取下一个路径值。注意: 添加了 rrim 语句,以确保在所有情况下路径返回以“/”结尾。它不检查它是否需要大于/var/www/,它也可以返回/var/www/作为可能的响应。

您也可以使用 真实路径

realpath(".")返回文档根目录。

您可以使用特定的路径调用 realpath。请注意,如果目标文件夹或文件不存在,则 没有将起作用。在这种情况下,它将返回 false,这对于测试文件是否存在非常有用。

在我的示例中,我需要为要写入磁盘的新文件指定一个路径,解决方案是相对于文档根添加路径:

$filepath = realpath(".") . "/path/to/newfile.txt";

希望这对大家有帮助。

目前,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 的原因如下(根据这个 回答) :

  • 它使您的应用程序依赖于服务器。
  • Apache 设置可能会给出一个不正确的根目录路径。

这招对我很管用,

realpath("../")

您可以使用这个 ../参数指向。它将指向1步回到您的实际工作文件

dirname(__FILE__)

是有用的,但会得到当前路径相对于当前文件的 URL 你在万一你在其他目录远离根目录如包括,你需要得到文件夹从根你可以使用整数参数2将去1级,等等

echo dirname(__FILE__, 2);

之前

C: Laragon www x 包括报告图表

之后

C: Laragon www x 报告图表

Reports 是根目录 x 中的文件夹

我在这里找到了答案: https://stackoverflow.com/a/24338828/7478226

<base href="http://localhost/abc/" />