标签:php
过去5天我遇到了一些问题,但我仍然陷入困境.现在我一直在阅读APP_ROOT,因为我不知道那是什么.我有一个header.html,有以下路径:
/Applications/MAMP/htdocs/website/resources/includes/header.html
我需要在我使用的每个页面上都包含它.在用户登录之前,我的文件位于:
/Applications/MAMP/htdocs/website
这也应该是我网站的ROOT.
用户登录后,我将我的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上询问了这个之后,我开始阅读有关定义ROOT的内容.我对它并不是很有信心,但这就是我得到的.
我在profile.php工作.我补充说:
echo $_SERVER['DOCUMENT_ROOT'];
在这里,我得到的是我的根:/ Applications / MAMP / htdocs.我认为,根应该是:/ Applications / MAMP / htdocs / website,那么我该如何改变呢?
我跑的时候
echo dirname(__FILE__);
我得到的文件位于:
/Applications/MAMP/htdocs/website/resources/auth
那是对的.
因此,对于我来说,问题是,由于我的ROOT未定义,导致错误.我如何定义根,所以它从/ Applications / MAMP / htdocs变为/ Applications / MAMP / htdocs / website?
我希望有人可以帮助我,所以我可以继续我的项目.
更新:
所以我的标题现在被调用,我现在正在研究CSS和JS部分,我需要在标题中调用它.所以我现在在我的标题中设置它.这是这样的吗?
解决方法:
对于原始问题,原始答案
$_SERVER [‘DOCUMENT_ROOT’]并不总是有用.根据服务器软件及其配置,它可以包含与文件所在路径没有任何共同点的路径.不要依赖它!使用下面介绍的技术,您可以在同一台服务器上托管多个应用程序.当您使用一个开发服务器开发和测试多个应用程序时,这非常有用.可以使用不同URL的HTTP访问每个应用程序,例如: http:// localhost / app1 /和http:// localhost / app2.
处理您的情况的最简单方法是使用相对路径指定要包含的文件,并使用dirname()和__DIR__从它们构建绝对路径.
原理很简单.如果你想在文件web / a.php中包含文件include / b.php,那么你可以在web / a.php中编写:
include dirname(__DIR__).'/include/b.php';
魔术常量__DIR__包含当前文件(web / a.php)所在的目录.我们不需要关心文件系统中的位置; PHP为我们处理它. PHP函数dirname()返回它接收的路径的父目录.
假设我们的项目位于/ path-to-project-.在web / a.php中,__DIR__的值是/ path-to-my-project / web和dirname(__ DIR__)returs / path-to-my-project.这是我们项目的根目录.
剩下的就是小菜一碟.只需附加要包含的文件的位置(在项目内).让我们注意到__DIR__和dirname()都产生不以斜杠(/)1结尾的路径.这就是为什么包含文件的文字路径必须以斜杠开头的原因:/include/b.php.
无论包含文件与包含者的相对位置如何,都可以使用该技术.您所要做的就是使用正确的dirname()调用次数来访问两个文件的第一个共同祖先目录(不一定是项目根目录),从那时起您就可以访问包含的文件.
例如,如果要在web / admin / d.php中包含include / b.php,则d.php必须包含:
include dirname(dirname(__DIR__)).'/include/b.php';
但是如果你想在web / a.php中包含web / c.php,那么你甚至不需要调用dirname():
include __DIR__.'/c.php';
仅限PHP 7
如果您使用的是PHP 7,则可以通过将级别数作为第二个参数传递,将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';
1此规则有一个例外:如果生成的路径是根目录(/),则__DIR__的值和dirname()返回的值不是空字符串而是/(以斜杠结尾).
更新答案以匹配问题的更新(关于CSS和JS文件)
您在HTML标头中编写的URL以加载CSS和JS是一个不同的故事.它们是(完整或部分)URL,而不是本地驱动器上的路径(与答案的第一部分相反,其中包括使用本地文件的路径.)
我上面的示例是Web应用程序的典型配置. Web服务器配置为从web /目录提供文件.那是$_SERVER [‘DOCUMENT_ROOT’]是/ path-to-my-project / web.当用户请求http://localhost/a.php时,服务器会加载并运行/path-to-my-project/web/a.php.
只能通过HTTP访问存储在web /及其子目录中的文件.您只放置了可以访问的文件:应用程序的页面和资源(图像,脚本,样式表).所有不能单独使用的文件(包含在其他文件中)必须位于web /目录之外.例如,在include /中.
资源通常位于web /目录的子目录中;图像中的图像/,js /中的脚本/样式/或css /中的样式表,但这不是规则;每个项目都使用自己的名字.
可以使用部分URL访问它们:图像为< img src =“/ images / file1.jpg”>,样式表为< link rel =“stylesheet”href =“/ css / style1.css”> ;,脚本as< script src =“/ js / script1.js”>.到其他页面的链接写为< a href =“/ m.php”> (m.php位于web /)或< a href =“/ admin / login.php”> (login.phpis当然位于inweb / admin /`).
浏览器将使用当前协议和主机名从中计算完整的URL.例如,为了加载/js/script1.js,浏览器计算其完整的URL(http://localhost/js/script1.js)并向服务器询问它.服务器(localhost)接收对资源/js/script1.js的请求.它知道站点根目录(/)映射到目录/ path-to-my-project / web,计算文件系统中的完整文件路径为/path-to-my-project/web/js/script1.js并返回其内容.
标签:php
来源: https://codeday.me/bug/20191002/1844384.html