我在 PHP 项目中有这个文件夹结构。 (如下图所示)
-MySystem +Code +Data_Access -Public_HTML +css +js +Templates -resources
当我尝试这个代码
echo $_SERVER['DOCUMENT_ROOT']
输出是
D:/工作区
如何在不硬编码文件夹名的情况下获取系统的 RootDirectory (MySystem)的路径?
MySystem
你可以试试: $_SERVER['PATH_TRANSLATED']
$_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
PATH_TRANSLATED
SCRIPT_FILENAME
PATH_INFO
httpd.conf
AcceptPathInfo = On
来源: Net/手册
PHP > = 5.3.0试试
PHP 魔法常数.
__DIR__
让你的道路相对。
PHP < 5.3.0试试
dirname(__FILE__)
你这么说的时候
$_SERVER['DOCUMENT_ROOT']
包含以下路径:
D:/workspace
那么 D:就是你要找的,不是吗? 在这种情况下,你可以用斜杠将字符串分开,然后返回第一个:
D:
$pathInPieces = explode('/', $_SERVER['DOCUMENT_ROOT']); echo $pathInPieces[0];
这将输出服务器的根目录。
更新: 当您使用常量 DIRECTORY_SEPARATOR而不是硬编码斜杠('/')时,这段代码也可以在 Windows 下工作。
DIRECTORY_SEPARATOR
'/'
更新2: $_SERVER全局变量并不总是可用。例如,在命令行(cli)上。因此,应该使用 __DIR__而不是 $_SERVER['DOCUMENT_ROOT']。__DIR__返回 php 文件本身的路径。
$_SERVER
使用 PHP 函数:
getcwd()
获取当前工作目录。
echo $pathInPieces = explode(DIRECTORY_SEPARATOR , __FILE__); echo $pathInPieces[0].DIRECTORY_SEPARATOR;
我想指出 WordPress 处理这个问题的方式:
define( 'ABSPATH', dirname( __FILE__ ) . '/' );
由于 Wordpress 在网络上的使用量非常大,而且在本地也能很好地工作,因此我非常信任这种方法。您可以在 wordpress wp-config.php文件的底部找到这个定义
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(".")
您可以使用特定的路径调用 realpath。请注意,如果目标文件夹或文件不存在,则 没有将起作用。在这种情况下,它将返回 false,这对于测试文件是否存在非常有用。
在我的示例中,我需要为要写入磁盘的新文件指定一个路径,解决方案是相对于文档根添加路径:
$filepath = realpath(".") . "/path/to/newfile.txt";
希望这对大家有帮助。
目前,PHP 本身并没有提供获取项目根目录的确切方法。
但是您可以自己实现一个非常简单的方法,该方法可以完全满足您的要求。
解决方案
在项目中创建一个新文件,比如 D:/workspace/MySystem/Code/FilesManager.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:
D:/workspace/MySystem/Code/a/b/c/Feature.php
echo FilesManager::rootDirectory();
预期结果应该是:
"D:/workspace/MySystem"
无论您的“特性”文件位于项目中的哪个位置,输出都是相同的。
解释
Dirname 用于返回第一个参数的父目录。我们使用 魔法常数 __FILE__给它 FilesManager.php的路径。第二个参数告诉在层次结构中向上提升多少次。在这种情况下,我们需要执行两次,但这实际上取决于您将文件放在层次结构中的哪个位置。如果只需要上升一次,则可以省略第二个参数,这意味着文件位于根目录中。但是,您可以直接返回 __DIR__。
__FILE__
FilesManager.php
无论根目录位于服务器上的哪个位置,这个解决方案都保证能够正常工作。除非您最终将实用程序类移动到层次结构中的其他位置。
附加说明
我避免使用 DOCUMENT _ ROOT 的原因如下(根据这个 回答) :
这招对我很管用,
realpath("../")
您可以使用这个 ../参数指向。它将指向1步回到您的实际工作文件
../
是有用的,但会得到当前路径相对于当前文件的 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/" />