当我尝试使用require
或require_once
时,如果要求的文件位于同一子目录中,它会正常工作,但只要它看到文件在其子目录之外,它就会生成一个致命的错误。这基本上是文件树的样子:
* main.php
+ login/
* login.php
+ includes/
* session.php
...所以基本上,如果我要main.php需要login / login.php,那很好,但如果我尝试对login.php进行目录遍历,要求包含/ session.php,则会失败,导致错误:
PHP致命错误:require_once():无法打开[...]
这个概念的代码是:
require('login/login.php') #works fine (main.php)
require('../includes/session.php') #quits (login.php)
我尝试过使用$_SERVER('DOCUMENT_ROOT')
,$_SERVER('SERVER_ADDR')
,dir(_FILE_)
和chdir(../)
。我记得几个月前在一个项目上工作,我解决了这个问题,它是一个遍历文件路径的简单函数,但我再也找不到它了。有任何想法吗?
答案 0 :(得分:3)
使用set_include_path()
,它会让您的生活更轻松。
答案 1 :(得分:1)
这不是递归,它只是普通的旧目录遍历。
永远不要使用include / require的相对路径。你永远不知道你的脚本被调用到哪个目录,所以你总是有可能在错误的工作目录中。这只是头疼的一个秘诀。
始终使用dirname(__FILE__)
获取当前文件所在目录的绝对路径。如果您使用的是PHP 5.3,则可以执行__DIR__
。 (注意前后两个下划线。)
require dirname(__FILE__).'/../includes/session.php';
(顺便说一句,你不需要围绕include / require的括号,因为它是一种语言结构,而不是一种功能。)
使用绝对路径也可能有更好的性能,因为PHP不需要查看include_path
中的每个目录。 (但这仅适用于include_path
中有多个目录的情况。)