【发布时间】:2010-06-08 16:06:40
【问题描述】:
我一直在使用 $_SERVER["DOCUMENT_ROOT"] 环境变量来引用我的应用程序中的公共根目录。现在我意识到这不是很可靠。我正在考虑一种方法,在我的 index.php 中基于魔法常数定义一个常数。类似的东西:
define("PUBILC", __DIR__."/");
不过我不确定。
你会推荐什么方法?
【问题讨论】:
标签: php
我一直在使用 $_SERVER["DOCUMENT_ROOT"] 环境变量来引用我的应用程序中的公共根目录。现在我意识到这不是很可靠。我正在考虑一种方法,在我的 index.php 中基于魔法常数定义一个常数。类似的东西:
define("PUBILC", __DIR__."/");
不过我不确定。
你会推荐什么方法?
【问题讨论】:
标签: php
如果所有请求都通过您的 index.php,定义一个常量将是一个很好且经常使用的想法。我还看到使用(虚拟)主机配置或 .htaccess 定义环境变量的设置,但我认为它的透明度和可移植性较差。经常使用设置变量中的硬编码路径,但不像人们希望的那样“自动更改”。总而言之,我同意你的想法。
【讨论】:
绝对不要在您的应用程序中散布$_SERVER['DOCUMENT_ROOT']。 Apache 可以配置为使用 VirtualDocumentRoot,这会将文档根目录设置为该目录,但不会更改可能导致站点损坏的 DOCUMENT_ROOT 环境变量。
根据您的方法,我喜欢在我的应用顶部定义DOC_ROOT,并在需要引用文档根目录的任何地方使用它。
【讨论】:
在一个操作系统我的项目中,我使用以下几行(以及一些其他行)进行了配置:
// set the root directory for the files
define('ROOT_DIR', "/path/to/my/htdocs/project_name/");
// set the root path for URLs
define('ROOT_PATH', "http://".$_SERVER['HTTP_HOST']."/project_name/");
在每个 php 文件中,我使用这一行包含这个 config.php:
require_once($_SERVER['DOCUMENT_ROOT'].'/config_project_name.php');
正如您所看到的,使用配置文件的前缀,您可以将它们全部放入您的根目录,并且您仍然足够灵活,可以在不同的 PC 或服务器上拥有相同的项目。
【讨论】:
你可以做类似的事情,但把它放在一些常见的包含文件中,该文件会包含在你的所有页面中。这适用于直接访问您网站上的页面而无需通过主索引页面的访问者。
例如,如果您的doc_root/inc 文件夹中有utilities.php,并且它包含在您的所有网站页面中,它可能看起来像这样:
<?php
function GetDocumentRoot()
{
return dirname(dirname(__FILE__));
}
function WriteHeader()
{
//...
}
// more utility functions...
?>
【讨论】: