获取PHP项目的根目录路径

时间:2011-12-29 14:00:26

标签: php

我的PHP项目中有这个文件夹结构。 (这在eclips中显示)

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

当我尝试这段代码时

echo $_SERVER['DOCUMENT_ROOT']

输出

  

d:/工作区

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

10 个答案:

答案 0 :(得分:128)

对于 PHP> = 5.3.0 ,请尝试

PHP magic constants

__DIR__

让你的路径相对。

对于 PHP< 5.3.0 尝试

dirname(__FILE__)

答案 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)

使用PHP函数:

getcwd()

获取当前工作目录。

答案 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

源: php.net/manual

答案 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:

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

答案 9 :(得分:0)

这对我有用,

realpath("../")

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