当我遇到一个奇怪的情况时,我正在用PHP编写一个Web应用程序。为了说明我的问题,请考虑这种结构的Web应用程序:
/
index.php
f1/
f1.php
f2/
f2.php
这些文件的内容:
的index.php:
<?php require_once("f1/f1.php"); ?>
f1.php:
<?php require_once("../f2/f2.php"); ?>
f2.php:空白
现在当我尝试在浏览器中打开index.php时出现此错误:
Warning: require_once(../f2/f2.php) [function.require-once]:
failed to open stream: No such file or directory in /var/www/reqtest/f1/f1.php on line 2
Fatal error: require_once() [function.require]:
Failed opening required '../f2/f2.php' (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/reqtest/f1/f1.php on line 2
有什么明显的东西我不见了吗?如何在PHP中包含路径?
在我提出这个问题之前,我试图尝试并找出答案。我设置了另一个测试,如下:
/
index.php
f1/
f1.php
f2.php
的index.php:
<?php require_once("f1/f1.php"); ?>
f1.php:
<?php require_once("f2.php"); ?>
f2.php:空白
令我惊讶(并且完全混淆),这很好!
那么,路径解析背后的秘诀是什么?
PS我看到了this question,但它仍然没有回答我在这里说过的第二个案例。
答案 0 :(得分:12)
如果包含其他文件,则工作目录仍保留包含文件的位置。
您的示例按预期工作。
编辑:第二个示例有效,因为。 (实际目录)位于包含路径中(请参阅错误消息)。
<强> EDIT2:强> 在您的第二个示例中,您感兴趣的关键点是这一行:
<?php require_once("f2.php"); ?>
首先它将查看当前工作目录(/var/www/req_path_test
),但找不到f2.php。
作为后备,它将尝试在include_path('.:/usr/share/php:/usr/share/pear'
)中找到f2.php,以'。'开头。 (相对于实际文件,而不是包括文件)。
所以'./f2.php'有效并且要求不会失败。
答案 1 :(得分:4)
当你打开index.php时,工作目录被设置为这个文件所在的文件夹。在内部f1.php中,这个工作目录不会改变。
您可以使用相对于当前包含文件的绝对路径来包含文件,如下所示:
require_once(dirname(__FILE__).'/../../test/file.php')
但如果这些文件包含类,最好考虑使用自动加载器。
答案 2 :(得分:0)
Normally在你旧结构中
<?php require_once("f2/f2.php"); ?>
而不是
<?php require_once("../f2/f2.php"); ?>
应该有效。据我所知,php采用了最初脚本的路径
答案 3 :(得分:0)
听起来您的服务器在PHP配置中启用了open_basedir设置。这使得无法在目录structur中的文件夹中包含(和打开)文件(即,您不能使用../进入文件夹结构)。
答案 4 :(得分:0)
从PHP文档PHP include
基于给定的文件路径或如果没有给定的include_path,则包含文件。如果在include_path中找不到该文件,则include最终将在失败之前检入调用脚本的自身目录和当前工作目录。
如果未提供文件路径,则为require_once(“ f2.php”);
1st。 include_path已检查
第二。检查调用脚本自己的目录
3rd。最后检查当前工作目录
如果找不到文件,则PHP在文件包含上引发警告,并在需要时出现致命错误
如果定义了路径(无论是绝对路径(在Windows中以驱动器号或\开头,在Unix / Linux系统上以/开头)还是相对于当前目录(以。或..开头),则include_path将被忽略共。例如,如果文件名以../开头,则解析器将在父目录中查找以找到请求的文件。
如果您包含/需要以开头的文件。或..或./,然后PHP的解析器将在父目录中查找当前工作目录,即require_once(“ ../ f2 / f2.php”),php将在根目录中检查调用脚本index.php在该目录中。
现在,您尚未在PHP脚本中定义任何包含路径,因此该路径始终回退到调用脚本,然后退回到当前工作目录。
// Check your default include path, most likely to be C:\xampp\php\PEAR
echo get_include_path();
// To set include path
set_include_path ( string $new_include_path ) : string
当前工作目录源自您的主调用脚本index.php。
// The Current Working Directory can be checked
echo getcwd();
在第一个示例中,所需文件“ ../f2/f2.php”来自f1.php
您的代码不起作用,因为-
因此您会遇到致命错误
在第二个示例中,您已更改目录&从f1.php中,您需要require_once(“ f2.php”)。
您的代码有效的原因--
这样您的代码就可以正常工作!