Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 应用程序根的定义不正确_Php - Fatal编程技术网

Php 应用程序根的定义不正确

Php 应用程序根的定义不正确,php,Php,在过去的5天里,我遇到了很多问题,但我仍然困在那里。现在我一直在读关于APP_ROOT的文章,因为我不知道那是什么。我有一个header.html,在下面的路径中有: /Applications/MAMP/htdocs/website/resources/includes/header.html 我需要在我使用的每一页上都包含这一点。在用户登录之前,我的文件位于: /Applications/MAMP/htdocs/website 这也应该是我的网站的根。 用户登录后,我将php文件拆分为

在过去的5天里,我遇到了很多问题,但我仍然困在那里。现在我一直在读关于APP_ROOT的文章,因为我不知道那是什么。我有一个header.html,在下面的路径中有:

/Applications/MAMP/htdocs/website/resources/includes/header.html
我需要在我使用的每一页上都包含这一点。在用户登录之前,我的文件位于:

 /Applications/MAMP/htdocs/website
这也应该是我的网站的根。 用户登录后,我将php文件拆分为文件夹。 目前我正在处理profile.php文件,其路径如下:

/Applications/MAMP/htdocs/Applications/MAMP/htdocs/website/resources/auth/profile.php
我已尝试在此文件中包含header.html,但出现以下错误:

Warning: include(resources/includes/header.html): failed to open stream: No such file or directory in /Applications/MAMP/htdocs/website/resources/auth/profile.php on line 2

Warning: include(): Failed opening 'resources/includes/header.html' for inclusion (include_path='.:/Applications/MAMP/bin/php/php5.6.2/lib/php') in /Applications/MAMP/htdocs/website/resources/auth/profile.php on line 2
在stackoverflow上询问了这个问题之后,我开始阅读关于定义根的内容。我不是很有信心,但我得到的是

我在profile.php中工作。我补充说:

echo $_SERVER['DOCUMENT_ROOT'];
我的根目录是:
/Applications/MAMP/htdocs
。在我看来,根目录应该是:
/Applications/MAMP/htdocs/website
,那么我该如何更改它呢

当我跑的时候

echo dirname(__FILE__);
我的文件位于:

/Applications/MAMP/htdocs/website/resources/auth
这是正确的

在我看来,我的问题是,这个错误是因为我的根没有定义。如何定义根,使其从
/Applications/MAMP/htdocs
更改为
/Applications/MAMP/htdocs/website

我希望有人能帮助我,这样我就能继续我的项目了

更新: 现在调用了我的头,我正在处理CSS和JS部分,我需要在头中调用它们。所以我现在在标题中设置了这个。是这样的吗


您使用
APP\u ROOT
定义应用程序根目录,这很有意义

但是对于php
APP_ROOT
是一个通用常量,没有任何特殊意义

要处理包含的文件,有一个专用功能,
set\u include\u path

$includePath = '/Applications/MAMP/htdocs/website/resources/includes';
set_include_path( get_include_path() . PATH_SEPARATOR . $includePath );
include 'header.html';
或:

注意在函数调用中使用了
get\u include\u path()
path\u分隔符
:使用
get\u include\u path()
我们将新的include路径附加到现有路径,而不进行覆盖
PATH_SEPARATOR
是一个预定义的常量,允许脚本在具有不同路径分隔符的不同操作系统上工作


[编辑:]现在您的头文件中存在相对URL问题。我建议您将其替换为动态根相对URL

以下是您的绝对路径:

/Applications/MAMP/htdocs/website/resources/auth/profile.php
/Applications/MAMP/htdocs/website/resources/includes/header.php
/Applications/MAMP/htdocs/website/resources/library/bootstrap/bootstrap.min.css
假设您的文档根为“/Applications/MAMP/htdocs”,则最终URL为:

http://hostname/website/resources/auth/profile.php
因此,要正确使用任何浏览器,包含文件中的所有链接都必须引用“”(如果是亲属关系),或者引用“”(如果是文档根亲属关系)

只需将根相对路径放入包含的文件中:

要参考
bootstrap.min.css
,您必须编写:

$url = '/website/resources/library/bootstrap/bootstrap.min.css';
$url = 'http://hostname/website/resources/library/bootstrap/bootstrap.min.css';
显然,只有在相同的站点/文档根目录下,这才有效。如果您打算在不同的站点中使用css,则需要插入完整的绝对URL,因为php本身无法知道文档根以外的内容。在这种情况下,你必须写:

$url = '/website/resources/library/bootstrap/bootstrap.min.css';
$url = 'http://hostname/website/resources/library/bootstrap/bootstrap.min.css';
$url
是要插入到
标记中的字符串)

注意如果您的真实文档根是“/Applications/MAMP/htdocs/website”,则必须从上述示例中删除“/website”。

原始问题的原始答案
$\u服务器['DOCUMENT\u ROOT']
并不总是有帮助。根据服务器软件及其配置,它可以包含与文件所在路径没有任何共同点的路径。不要依赖它!使用下面介绍的技术,您可以在同一台服务器上托管多个应用程序。当您使用一台开发服务器开发和测试多个应用程序时,这非常有用。每个应用程序都可以在不同的URL上使用HTTP进行访问,例如
http://localhost/app1/
http://localhost/app2

处理这种情况的最简单方法是使用相对路径来指定要包含和使用的文件,并从中构建绝对路径

原理很简单。如果在文件
web/a.php
中希望包含文件
include/b.php
,则在
web/a.php
中编写:

include dirname(__DIR__).'/include/b.php';
魔法常量
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我们不需要关心它在文件系统中的位置;PHP为我们解决了这个问题。PHP函数
dirname()
返回它接收的路径的父目录

假设我们的项目位于我的项目路径中。在
web/a.php
中,
\uuuuu DIR\uuuuu
的值是
/path to my project/web
dirname(\uuu DIR\uuuu)
returs
/path to my project
。这是我们项目的根目录

其余的都是小菜一碟。只需附加要包含的文件的位置(在项目内部)。让我们注意一下,
\uu DIR\uu
dirname()
都会生成不以斜杠(
/
)1结尾的路径。这就是为什么包含文件的文本路径必须以斜杠开头:
/include/b.php

无论包含的文件与includer的相对位置如何,都可以使用该技术。您所要做的就是使用对
dirname()
的正确调用次数来访问这两个文件的第一个公共祖先目录(不一定是项目根目录),从这一点上可以访问包含的文件

例如,如果要在
web/admin/d.php
中包含
include/b.php
,则
d.php
必须包含:

include dirname(dirname(__DIR__)).'/include/b.php';
但是如果您想在
web/a.php
中包含
web/c.php
,那么您甚至不需要调用
dirname()

仅限PHP 7 如果您使用的是PHP7,则可以通过传递级别数,将对
dirname()
的嵌套调用列表压缩为单个调用
// Any version of PHP
include dirname(dirname(dirname(__DIR__))).'/include/b.php';


// Only PHP 7 and newer
include dirname(__DIR__, 3).'/include/b.php';