我的PHP项目中有这个文件夹结构。 (这在eclips中显示)
-MySystem
+Code
+Data_Access
-Public_HTML
+css
+js
+Templates
-resources
当我尝试这段代码时
echo $_SERVER['DOCUMENT_ROOT']
输出
d:/工作区
如何在不对文件夹名称进行硬编码的情况下获取系统的RootDirectory路径(MySystem
)?
答案 0 :(得分:128)
答案 1 :(得分:54)
当你这么说时
$_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文件本身的路径。
答案 2 :(得分:30)
答案 3 :(得分:8)
我想指出Wordpress处理这个问题的方式:
define( 'ABSPATH', dirname(dirname(__FILE__)) . '/' );
由于Wordpress在网络上使用非常繁重,而且在本地也很好用,我非常信任这种方法。
答案 4 :(得分:3)
$_SERVER['PATH_TRANSLATED']
报价:
在服务器完成任何虚拟到实际映射之后,文件系统 - (不是文档根目录 - )基于当前脚本的路径。注意:从PHP 4.3.2开始,与Apache 1中的情况相比,不再在Apache 2 SAPI下隐式设置
PATH_TRANSLATED
,在Apache 1中,它设置为与SCRIPT_FILENAME
服务器变量相同的值。它不是由Apache填充的 进行此更改是为了符合CGI规范,即只有在定义PATH_INFO
时才应存在PATH_TRANSLATED。 Apache 2用户可以使用AcceptPathInfo = On
内的httpd.conf
来定义PATH_INFO
答案 5 :(得分:1)
echo $pathInPieces = explode(DIRECTORY_SEPARATOR , __FILE__);
echo $pathInPieces[0].DIRECTORY_SEPARATOR;
答案 6 :(得分:0)
摘要
此示例假定您始终知道apache根文件夹在哪里,并且您正在尝试查找下一个文件夹路径(例如,'/ 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 /'),然后使用它,否则获取当前dir(项目中已存在的目录),并根据$ root路径的计数获取下一个路径值。注意:添加了rtrim语句,以确保在所有情况下路径返回均以'/'结尾。它不会检查是否要求它大于/ var / www /,也可以返回/ var / www /作为可能的响应。
答案 7 :(得分:0)
您也可以使用realpath。
SELECT DAYOFYEAR(DATE_FORMAT('2018-09-14', '%Y-12-31')); -- 365 days
SELECT DAYOFYEAR(DATE_FORMAT('2019-09-14', '%Y-12-31')); -- 365 days
SELECT DAYOFYEAR(DATE_FORMAT('2020-09-14', '%Y-12-31')); -- 366 days!!!
SELECT DAYOFYEAR(DATE_FORMAT('2021-09-14', '%Y-12-31')); -- 365 days
SELECT DAYOFYEAR(DATE_FORMAT('2022-09-14', '%Y-12-31')); -- 365 days
返回您的文档根目录。
您可以使用特定路径调用realpath。请注意,如果目标文件夹或文件不存在,它将不起作用。在这种情况下,它将返回false,这对于测试文件是否存在很有用。
在我的情况下,我需要指定一个用于将新文件写入磁盘的路径,解决方案是将相对于文档根的路径附加到该路径:
realpath(".")
希望这对任何人都有帮助。
答案 8 :(得分:0)
目前,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用于返回第一个参数的父目录。我们使用magic constant __FILE__
为其提供路径FilesManager.php
。第二个参数告诉您在层次结构中上移多少次。在这种情况下,我们需要做两次,但这实际上取决于您将文件放在层次结构中的位置。如果只需要起床一次,则可以省略第二个参数,这意味着该文件位于根目录中。但是,您可以直接返回__DIR__
。
无论您的服务器根目录位于何处,该解决方案均能保证正常工作。除非最终将实用程序类移动到层次结构中的其他位置。
附加说明
出于以下原因(根据此answer),我将避免使用DOCUMENT_ROOT:
答案 9 :(得分:0)
这对我有用,
realpath("../")
您可以使用此 ../
参数来指向。它将指向 1 步回到您的实际工作文件