获取PHP项目的根目录路径


115

我的PHP项目中有此文件夹结构。(如日食所示)

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

当我尝试此代码

echo $_SERVER['DOCUMENT_ROOT']

输出是

D:/工作区

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

Answers:


146

对于PHP> = 5.3.0尝试

PHP 魔术常数

__DIR__

并使您的道路相对。

对于PHP <5.3.0,请尝试

dirname(__FILE__)

3
这真是太棒了,我尝试了$ _SERVER ['DOCUMENT_ROOT'],dirname(),$ _ SERVER ['SCRIPT_NAME']等,但是效果很好!
webblover 2014年

78
这确实取决于您在哪里使用__DIR__ 。它是相对于文件本身的,因此,如果包含在子目录内的包含中,它将不会仅返回您的根目录。
艾里斯(Iris)2015年

10
它不会提供根目录
inrsaurabh

1
对于任何偶然发现该问题的人的快速注释,DIR获取当前文件的目录,而不是项目根目录,除非您在项目根目录中的文件中调用它,但是php不会具有项目概念,所有路径都必须是绝对路径或相对于当前位置的路径
MikeT

请不要仅仅因为它对您有所帮助而拒绝回答不能正确解决该问题的答案。
ElYeante

73

当你这么说

$_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
您可以使用__DIR__代替$_SERVER['DOCUMENT_ROOT']
阿明

抱歉,如果我没有正确解释我的问题,我真正需要的是“ D:/ workspace / MySystem”
Nalaka526 2011年

1
如果您的根目录路径为/ var / public / www形式,则使用此方法,数组中的第一个字符串将为空(0)/(1)/(2)/(3)。根目录为第二个字符串$ pathInPieces [1]
tbradley22


9

我想指出Wordpress处理此问题的方式:

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

由于Wordpress在网络上使用量很大,并且在本地也可以正常工作,因此我对这种方法非常信任。


1
我猜这仅在您具有两个级别的目录时才有效。对?我的意思是,当从base_project_directory / folder1 / folder2 / folder3 / file.php调用它时,它不会返回base_project_directory。
阿里·哈利利

“由于Wordpress在网络上使用率很高,并且在本地也可以正常工作,因此我对这种方法非常信任。” 考虑到WP代码的质量和安全记录,我认为这不是一个特别好的论点。
Alex Barker

1
@AlexBarker我会质疑您暗示WP具有不良安全记录的事实。它实际上是相当安全的,并且拥有一个专注于安全性的令人反感的团队-近年来,core很少有被利用的安全性问题(包括早在您发表评论时)。
威廉·帕顿

3

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

引用:

服务器完成任何虚拟到实际的映射之后,当前文件的基于文件系统(不是文档根目录)的路径。注意:从PHP 4.3.2开始,PATH_TRANSLATED与Apache 1中的情况相比,不再在Apache 2 SAPI下隐式设置该属性,在Apache 1 SAPI中,SCRIPT_FILENAME当未由Apache填充时,它被设置为与服务器变量相同的值。
进行此更改是为了符合CGI规范,即仅在PATH_INFO定义了PATH_TRANSLATED的情况下才应存在。Apache 2用户可以使用AcceptPathInfo = OnInside httpd.conf来定义PATH_INFO

资料来源: php.net/manual



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 /”),然后使用它,否则获取当前目录(项目中存在的目录),并根据$ root路径的计数获取下一个路径值。注意:添加了rtrim语句,以确保在所有情况下路径返回均以'/'结尾。它不检查它是否需要大于/ var / www /,也可以返回/ var / www /作为可能的响应。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.