PHP如何找到应用程序根?

Posted

技术标签:

【中文标题】PHP如何找到应用程序根?【英文标题】:PHP how to find application root? 【发布时间】:2011-04-26 12:56:57 【问题描述】:

我的包含文件有问题。当我使用 require_once('somefile.php') 时,我似乎无法弄清楚如何构建我的 URL。如果我尝试在多个目录结构不同的地方使用包含文件,则会收到找不到包含文件的错误。

在 asp.net 中,要获取我的应用程序根路径,我可以使用 ~/directory/file.aspx。 tild 正斜杠始终知道我是从我的网站根目录引用并找到文件,无论请求来自我的网站中的哪个位置。它总是返回根目录并从那里查找文件。

问题:如何获取我网站的根路径?我怎样才能做到这一点,以便我可以从我的站点中的任何地方重用我的包含文件?我必须在我的 URL 中使用绝对路径吗?

谢谢!

【问题讨论】:

URL 构造与 require_once 无关。 URL 不是文件。这是 HTTP 协议,而不是文件系统 您使用的是什么 PHP 版本,您的文件系统结构是什么样的? 【参考方案1】:

很高兴能够在每个脚本的顶部使用相同的代码,并且知道您的页面将正确加载,即使您位于子目录中也是如此。我使用这个,它依赖于你知道你的根目录被称为什么(通常是'htdocs'或'public_html':

defined('SITEROOT') or define('SITEROOT', substr($_SERVER['DOCUMENT_ROOT'], 0, strrpos($_SERVER['DOCUMENT_ROOT'], 'public_html')) . 'public_html');

通过一致地定义 SITEROOT,您可以访问配置文件和/或页面组件,而无需逐个脚本调整路径,例如到存储在根文件夹之外的配置文件:

require_once SITEROOT . "/../config.php";

【讨论】:

【参考方案2】:

我一般将config.php文件存放在ROOT目录,在config.php我写:

define('ROOT_DIR', __DIR__);

然后在所有其他脚本中使用 ROOT_DIR 常量。 使用$_SERVER['DOCUMENT_ROOT'] 不是很好,因为:

它并不总是匹配 ROOT_DIR 此变量在 CGI 模式下不可用(例如,如果您通过 CRON 运行脚本)

【讨论】:

要在所有其他脚本中使用 ROOT_DIR 常量,您必须在所有其他脚本中包含一个包含它的文件。所以,又是同样的问题。 是的,但至少你可以使用:include(ROOT_DIR.'/known/path/to/file.php');而不是使用类似的东西: $ROOT = '../../../'; (必须在每个子目录中更改),但是您必须始终担心 $ROOT 的全球化。【参考方案3】:

$_SERVER['DOCUMENT_ROOT'] 应该有你的网络服务器的根路径。

编辑:如果您查看大多数主要的 php 程序。使用安装程序时,您通常输入应用程序文件夹的完整路径。安装程序只会将其放入整个应用程序中包含的配置文件中。一种选择是使用auto prepend file 来设置变量。另一种选择是在您需要的每个页面上仅include_once() 配置文件。我建议的最后一个选项是使用bootstrapping 编写您的应用程序,您可以在其中通过一个文件(通常使用 url_rewrite)汇集所有请求。这使您可以轻松地在一个位置设置/包含配置变量,并使它们在所有脚本中都可用。

【讨论】:

在我使用 WampServer 的开发机器上,当我使用 $_SERVER['DOCUMENT_ROOT'] 时,我得到 C:/wamp/www/。然而,我的网站位于 C:/wamp/www/mysite/。如果我的网站托管在像共享主机这样的实时服务器上,那么使用 $_SERVER['DOCUMENT_ROOT'] 会得到什么? 发生这种情况是因为实际的应用程序根目录是 C:/wamp/www 并且您将代码托管在它的子目录中。您可能想要更改此项目的文档根目录或创建一个变量 (const MY_APP_ROOT = ... 那么在像共享主机这样的实际托管环境中,$_SERVER['DOCUMENT_ROOT'] 会产生我网站文件夹的路径吗?我说的对吗? 好的,我终于明白了。谢谢大家! @Scott W. 我用更多选项和解释更新了我的答案。祝你好运。【参考方案4】:

试试这个:

$_SERVER['DOCUMENT_ROOT']

【讨论】:

不 - OP 正在寻找基本 URL,而不是文件路径 @Scott 其实这个变量的唯一用途就是加载包含文件 正确: 工作得很好,在这里【参考方案5】:

您也可以在 .htaccess 文件中设置基目录

SetEnv BASE_PATH C:/wamp/www/mysite/

然后在PHP中你可以用$_SERVER['BASE_PATH']引用它

【讨论】:

如果使用此范例,您可能会在将代码移动到不同目录或不同主机时遇到问题。例如,如果您在 Linux 服务器上托管,那么“C:/wamp/www/mysite/”将不会是您的网站所在的位置。我不确定这条路径是否会出现在 Windows 托管服务中。【参考方案6】:

在某个配置文件中定义它。

假设您使用的是 MVC 样式,其中所有内容都通过单个 index.php 进行路由,那么

realpath('.');

将显示当前工作目录的路径(即 index.php 所在的位置)

那么你可以把它定义为

define('PROJECT_ROOT', realpath('.'));

如果它不是 MVC 并且您需要它来处理子文件夹中的文件,那么您可以将其硬编码到配置文件中

define('PROJECT_ROOT', 'C:/wamp/www/mysite');

然后当包括你可以做的事情时;

include PROJECT_ROOT . '/path/to/include.php';

【讨论】:

【参考方案7】:

您应该使用内置的魔术常量来查找文件。 __FILE____DIR__。如果您使用的是 PHP dirname(__FILE__)

例如

require_once __DIR__.'/../../include_me.php';

$_SERVER['DOCUMENT_ROOT'] 并不总是保证返回您期望的结果。

【讨论】:

为什么它不能在子目录中工作? require_once __DIR__.'/i/am/a/sub/dir.php 不幸的是,这些解决方案似乎都不起作用。 $_SERVER['DOCUMENT_ROOT'] 最接近解决方案,但它不加载包含文件。 虽然我这辈子都做不到。我不得不重写整个函数,并从包含 URL 始终相同的不同位置注入包含。它是用于根据用户名、密码和角色保护其所在页面的授权脚本。我是 PHP 的新手,我喜欢它,但在这个阶段我正在经历一些成长的痛苦。除非万不得已,否则我不会做 asp.net。 PHP 拥有我需要的一切,还有更多。感谢大家的帮助! @anon :对我来说效果很好。也许您的 Web 服务器的文档根目录配置错误?我的似乎指向该站点的根目录。

以上是关于PHP如何找到应用程序根?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 在 Windows 上的 Xampp 中正确获取“应用程序根目录”

如何在根视图中隐藏导航控制器?

如何找到根控制起找到根控制器及获得文件夹路径

如何在phonegap中运行php文件?

如何找到根 UIViewController

Atitit.获取approot api 应用根路径 java c#.net php asp