【问题标题】:How can I control DOCUMENT_ROOT to work on localhost and live server?如何控制 DOCUMENT_ROOT 在本地主机和实时服务器上工作?
【发布时间】:2011-01-19 07:13:49
【问题描述】:

为了让 URL 在受版本控制的项目中正常工作,我一直在使用 $_SERVER['DOCUMENT_ROOT']。问题是,我在一个文件夹中开发项目,所以我得到了这个:

$_SERVER['DOCUMENT_ROOT'] 。 '/文件夹/路径/to/file.php'

当我上线时,我通常只需要以下内容:

$_SERVER['DOCUMENT_ROOT'] 。 '/path/to/file.php'

我知道世界上存在比删除和添加此文件夹名称更大的问题,但有没有一种方法可以轻松地自动执行此操作?我可以以某种方式在本地设置我的文档根目录以包含我正在使用的文件夹吗?我对事情的运作方式有根本的误解吗?在这方面有点新意,并希望尽可能多地学习并真正理解“为什么”。

非常感谢!

【问题讨论】:

    标签: php localhost


    【解决方案1】:

    在任何 root 文件 (index.php)

    中声明以下行
    $_SESSION["uploads_base_url"]=dirname(__FILE__); 
    

    您现在可以在任何需要上传的文件中使用它。

    echo $uploads_base_url=$_SESSION["uploads_base_url"];
    

    【讨论】:

    • 但这里有一个问题,因为现在你在每个页面上都使用 session_start() ......更好的解决方案不是使用 GLOBALS?
    【解决方案2】:

    为什么不使用$_SERVER['DOCUMENT_ROOT'],而不是声明一个始终保存Web 应用程序根的常量?

    <?php
    define('ABSPATH', dirname(__FILE__));
    

    将以下代码放入应用程序根文件夹中的文件中,并在每次页面加载时包含它。

    然后,无论您的本地副本是否位于子目录 folder 中,您都可以简单地始终使用 $path = ABSPATH . '/path/to/file.php';


    如果您的应用程序已经有一个包含在每个页面加载中的文件,您只需将上面的代码拖放到该文件中即可。

    请注意,您可能需要添加额外的dirname() 调用,具体取决于该文件所在的位置。为您从 web 应用的根目录传递的每个目录添加一个。

    例如,如果你的webapp位于/webapp/,而你的“全局包含”位于/webapp/includes/framework/init.php,那么上面的代码就需要这样修改:

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

    即:由于来自 webapp 根目录 (includes/framework) 的两个额外文件夹,导致额外的 2 个 dirname() 调用


    澄清

    上面的代码应该在一个文件中,而一个文件只在您的 Web 应用程序中。该文件需要包含在每个页面加载中。

    如果您已经有一个在任何处理之前包含的文件(例如配置文件或其他文件),您可以将该代码复制并粘贴到该文件中。

    dirname() 调用次数取决于您复制和粘贴的文件的深度 中的代码相对于您的 Web 应用程序的根目录。对于上面的示例,假设您的 Web 应用程序的根由 ~ 表示。

    如果您将我的代码复制粘贴到~/abspath.php,那么您需要一个dirname() 调用。

    如果您将我的代码复制粘贴到~/includes/abspath.php,那么您需要两次dirname() 调用。

    如果您将我的代码复制粘贴到~/includes/config/abspath.php,那么您需要三个dirname() 调用。现在让我们说这是它的最终位置。

    ~/index.php 中,您执行以下操作:

    <?php
    require_once('includes/config/abspath.php');
    

    您可以访问ABSPATH

    ~/dir/someOtherPage.php 中,您执行以下操作:

    <?php
    require_once('../includes/config/abspath.php');
    

    您可以访问ABSPATH

    这就是为什么我说如果您已经有一个包含在每个页面加载中的文件,只需将上述代码放入其中就更简单了。只要确保相应地修改dirname() 调用的数量即可。同样,此代码只能在一个文件中。

    【讨论】:

    • 好吧,安德鲁,你的方法一开始有点难掌握。让我检查一下我明白了:每个目录名从包含文件的位置上升一级?因此,如果包含的文件位于我要访问的位置 (myLoc),它只有一个 dirname(),但如果它位于 myLoc/sub1/sub2/sub3,那么我将使用 dirname(dirname(dirname(目录名(文件))));?所以本质上,目录名的数量允许我总是从我想要从 ABSPATH 开始的位置开始?
    • 这很好用;非常感谢您提供完美的解决方案,Andrew。
    • 太棒了。我将它包含在我的标题中所需的常量文件中,该文件包含在每个页面中。在开发上运行良好,我希望它在生产上完美运行;即将svn到那里。
    • 我收到一个错误,页面甚至无法加载。但是我需要做一个小的调整。如果您的通用 php 文件不在根目录中,并且您想获取根目录的绝对路径,请使用:define('ABSPATH',dirname(dirname(FILE)) .'/') ;
    • 另外,如果你想在引号内使用它,你必须使用 $,例如。 echo '文本'.$ABSPATH.'文字文字'
    猜你喜欢
    • 2018-09-12
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    相关资源
    最近更新 更多