我将根目录保存在变量$root
中。然后我将文件地址的其余部分附加到包含。
error_reporting(E_ALL);//gives me nothing btw
$root = "http://myhomedirectory.int/tools";
include ("{$root}/resources/php/includes/authenticate.php");
echo "{$root}/resources/php/includes/authenticate.php";
由于某种原因,包含失败,但是当我复制/粘贴echo语句产生的内容时,我将被带到authenticate.php
。我已将该文件的权限设置为777.为什么会这样?
答案 0 :(得分:4)
include()
用于读取本地php文件的文件内容。它开始搜索在php.ini中定义的include目录,最后尝试将参数解释为相对路径。
当您提供绝对路径(如http:// ...)时,远程服务器将永远不会返回php脚本,而是返回纯HTML。 (即使它是您的LOCAL服务器,使用外部地址的调用也不会返回任何PHP代码,因为服务器将解析文件内容并返回生成的html)
因此,要在服务器上包含一个php文件,请使用相对路径或将其放入定义的include目录中。
Sidenode:如果你想要包含每个ohter的各种文件,你总是* 必须定义相对于执行脚本的路径。假设布局:
/index.php
/folder1/file1.php
/folder1/folder2/file2.php
并且您希望file2
中的file1
和file1
中的index.php
(这是已执行的脚本),PHP将执行以下步骤:
index.php
是已执行的脚本,因此使用include("folder1/file1.php")
将执行所需的操作。但是,如果您现在还要在file2
中添加file1
,则必须想象 file1
已被提升到根目录/
,因此,file1
中的包含只有在您定义了相对于根的路径时才会起作用:include("folder1/folder2/file2.php")
- 即使file1
实际位于folder1
中。
直接调用file1
现在将失败,因为php将搜索folder1/folder1/folder2/file2.php
- 这就是为什么将文件放入“全局”包含路径应优先于相对引用。 ( if 且 if if 你也直接调用子文件夹的文件*)
通常,您希望对所有请求使用index.php
- 然后所有子文件夹的文件都是相对于您网站的根目录,这样您就可以省略全局包含目录并按顺序使用相对路径在同一台服务器上拆分多个项目。
(* AJAX会破坏这个原则,导致ajax调用的php文件将在其实际目录中执行,而不是从包含包含ajax调用的文件的目录执行!)