PHP如何找到应用程序根?

PHP如何找到应用程序根?,php,include-path,Php,Include Path,我的include文件有问题。当我使用require_once('somefile.php')时,我似乎不知道如何构造URL。如果我试图在目录结构不同的多个位置使用包含文件,我会得到一个错误,即无法找到包含文件 在asp.net中,要获取我的应用程序根路径,我可以使用~/directory/file.aspx。平铺正斜杠总是知道我是从我的网站根目录中引用的,并且无论请求来自我的网站的何处,都可以找到该文件。它总是引用回根目录并从那里查找文件 问题:如何获取网站的根路径?我如何做到这一点,以便可以

我的include文件有问题。当我使用require_once('somefile.php')时,我似乎不知道如何构造URL。如果我试图在目录结构不同的多个位置使用包含文件,我会得到一个错误,即无法找到包含文件

在asp.net中,要获取我的应用程序根路径,我可以使用~/directory/file.aspx。平铺正斜杠总是知道我是从我的网站根目录中引用的,并且无论请求来自我的网站的何处,都可以找到该文件。它总是引用回根目录并从那里查找文件

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


谢谢大家!

有一个
$\u服务器['DOCUMENT\u ROOT']
应该具有指向web服务器的根路径

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

尝试以下方法:

$_SERVER['DOCUMENT_ROOT']

您应该使用内置的魔法常量来查找文件<代码>文件和
目录。如果您使用的是PHP<5.3,那么应该使用
dirname(\uuu文件)

例如


$\u服务器['DOCUMENT\u ROOT']
并不总是保证返回您期望的内容

在某个配置文件中定义它

假设您使用的是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';

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

SetEnv BASE_PATH C:/wamp/www/mysite/

然后在PHP中,您可以使用
$\u SERVER['BASE\u PATH']

引用它,我通常将
config.PHP
文件存储在根目录中,并在
config.PHP
中写入:

define('ROOT\u DIR','uuuuu DIR\uuuu)

然后在所有其他脚本中使用ROOT\u DIR常量。 使用
$\u服务器['DOCUMENT\u ROOT']
不是很好,因为:

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

能够在每个脚本的顶部使用相同的代码,并且知道即使您在子目录中,页面也能正确加载,这很好。我使用它,这依赖于您知道根目录的名称(通常是“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";

URL的构造与require_once无关。URL不是文件。它是HTTP协议,而不是文件系统。您使用的是什么PHP版本,您的文件系统结构是什么样子的?在使用WampServer的开发机器上,当我使用$_SERVER['DOCUMENT_ROOT'时,我会得到C:/wamp/www/.My site位于C:/wamp/www/mysite/。如果我的站点托管在像共享主机一样的实时服务器上,那么使用$\u server['DOCUMENT\u ROOT'会得到什么?发生这种情况是因为实际的应用程序根是C:/wamp/www,并且您将代码托管在该应用程序的子目录中。您可能希望更改此项目的文档根或创建一个变量(const MY_APP_root=…因此在实际的托管环境(如共享主机)中,$\u SERVER['document_root']是否会提供指向我网站文件夹的路径?我说得对吗?好的,我终于找到了。谢谢大家!@Scott W。我用更多的选项和解释更新了我的答案。祝你好运。没有-OP是在寻找基本URL,而不是文件path@Scott事实上,这个变量的唯一用途是加载include filesCorrect:works刚刚好,为什么它在sub-dirs中不起作用吗?
require\u once\u DIR\u./i/am/a/sub/DIR.php
不幸的是,这些解决方案似乎都不起作用。$\u服务器['DOCUMENT\u ROOT']最接近解决方案,但它不加载包含文件。但我一辈子都无法让它工作。我必须重写整个函数,并从包含url始终相同的不同位置注入包含。它是用于基于用户名、密码保护其中的页面的授权脚本和角色。我对PHP是全新的,我喜欢它,但我在这个阶段经历了一些成长的痛苦。除非我必须这样做,否则我不会做asp.net。PHP有我需要的一切,还有更多。谢谢所有的帮助!@anon:对我来说很好。也许你的web服务器配置了文档根?我的看起来是指向e站点的根目录。要在所有其他脚本中使用root_DIR常量,您必须将包含它的文件包含到所有其他脚本中。因此,同样的问题再次出现。是的,但至少您可以使用:include(root_DIR.'/known/path/to/file.php');而不是使用类似于:$root='../../../';(在每个子目录中都必须更改),但您必须始终担心全局化$ROOT。如果使用此范例,则在将代码移动到其他目录时可能会遇到问题
require_once SITEROOT . "/../config.php";