获取PHP项目的根目录路径

Nal*_*526 104 php

我的PHP项目中有这个文件夹结构.(如eclips所示)

-MySystem
    +Code
    +Data_Access
    -Public_HTML
        +css
        +js
        +Templates
    -resources
Run Code Online (Sandbox Code Playgroud)

当我尝试这个代码

echo $_SERVER['DOCUMENT_ROOT']
Run Code Online (Sandbox Code Playgroud)

输出是

d:/工作区

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

Pra*_*sha 139

对于PHP> = 5.3.0试试

PHP 魔术常数.

__DIR__
Run Code Online (Sandbox Code Playgroud)

并使你的道路相对.

对于PHP <5.3.0试试

dirname(__FILE__)
Run Code Online (Sandbox Code Playgroud)

  • 它确实取决于你使用`__DIR__`的地方.它与文件本身有关,因此如果在include中,在子目录中,它将不会仅返回您的根目录. (68认同)
  • 它不会给根目录 (6认同)
  • 对于任何偶然发现这个答案寻找所问问题的答案的人来说, __DIR__ 获取当前文件的目录而不是项目根目录,除非您在项目根目录中的文件中调用它,但因为 php 不会有项目的概念所有路径都必须是绝对路径或相对于当前位置 (4认同)
  • 这真棒,我尝试了$ _SERVER ['DOCUMENT_ROOT'],dirname(),$ _SERVER ['SCRIPT_NAME']等等,但是效果非常好! (3认同)
  • 请不要仅仅因为对您有帮助而对未正确解决问题的答案进行投票。 (2认同)
  • 此解决方案不返回根目录。它返回从内部运行的文件的目录。这个答案完全没有用并且具有误导性! (2认同)

Arm*_*min 63

当你这么说的时候

$_SERVER['DOCUMENT_ROOT']
Run Code Online (Sandbox Code Playgroud)

包含此路径:

D:/workspace
Run Code Online (Sandbox Code Playgroud)

D:就是你在找什么,不是吗?在这种情况下,您可以通过斜杠爆炸字符串并返回第一个:

$pathInPieces = explode('/', $_SERVER['DOCUMENT_ROOT']);
echo $pathInPieces[0];
Run Code Online (Sandbox Code Playgroud)

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

更新:当您使用常量DIRECTORY_SEPARATOR而不是硬编码斜杠('/')时,此代码也可以在Windows下运行.

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

  • 你可以使用`__DIR__`而不是`$ _SERVER ['DOCUMENT_ROOT']`. (2认同)

dki*_*zer 34

使用PHP函数:

getcwd()

获取当前工作目录.

  • 这将返回当前执行文件路径。不是根路径 (5认同)

Hex*_*dus 9

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

define( 'ABSPATH', dirname(dirname(__FILE__)) . '/' );
Run Code Online (Sandbox Code Playgroud)

由于Wordpress在整个网络上使用非常繁重,并且在本地工作正常,我对此方法非常信任.

  • @AlexBarker 我会对您暗示 WP 的安全记录不佳这一事实提出质疑。它实际上非常安全,并且拥有一个专注于安全性的快速反应团队 - 近年来,核心几乎没有被利用的安全问题(包括早在您发表评论时)。 (2认同)

小智 7

目前,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);
  }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以做到这一点,让我们说D:/workspace/MySystem/Code/a/b/c/Feature.php

echo FilesManager::rootDirectory();
Run Code Online (Sandbox Code Playgroud)

预期的结果应该是:

"D:/workspace/MySystem"
Run Code Online (Sandbox Code Playgroud)

无论您的“功能”文件位于项目中的哪个位置,输出都将相同。

解释

dirname用于返回第一个参数的父目录。我们使用魔法常数 __FILE__来给出它FilesManager.php的路径。第二个参数告诉在层次结构中上升多少次。在这种情况下,我们需要做两次,但这实际上取决于您将文件放在层次结构中的位置。如果你只需要起来一次,你可以省略第二个参数,这意味着文件位于根目录。但是,您可以__DIR__直接返回。

无论根目录位于服务器上的哪个位置,此解决方案都可以保证有效。除非您最终将实用程序类移动到层次结构中的其他位置。

附加说明

由于以下原因(根据此答案),我会避免使用 DOCUMENT_ROOT :

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


Mah*_*gdy 5

dirname(__FILE__)
Run Code Online (Sandbox Code Playgroud)

很有用,但会获取相对于当前文件 URL 的当前路径,以防万一您位于远离根目录的其他目录中,例如 include,并且您需要从根目录获取文件夹,您可以使用整数参数 2 将向上 1 级,依此类推

echo dirname(__FILE__, 2);
Run Code Online (Sandbox Code Playgroud)

C:\larragon\www\x\includes\reports\charts

C:\larragon\www\x\reports\charts

reports 是根目录 x 内的文件夹