如何从不同的目录 require_once?
Posted
技术标签:
【中文标题】如何从不同的目录 require_once?【英文标题】:How to require_once from different directories? 【发布时间】:2013-01-24 10:39:36 【问题描述】:我试图从不同文件夹中的 php 文件中获取我的“库”文件,但在尝试从子文件夹访问它们时会出错。比如我有这样一个目录:
+ home
- file1.php
++ subfolder
- file2.php
++ libraries
- code_generator.php
- database_library.php
code_generator.php 还依赖于其他库:
(LINE 25) require_once(realpath("./libraries/database_library.php"));
//this works fine when called from file1.php, but not from file2.php
我尝试从 ./subfolder/file2.php 调用 code_generator,例如:
chmod("../libraries/codegenerator.php", 0777); // for the error at the end of this question
require_once("../libraries/code_generator.php");
当我运行 file2.php 时,它会产生 2 个错误:
**Warning**: require_once(C:\xampp\htdocs\home\subfolder): failed to open stream: Permission denied in C:\xampp\htdocs\home\libraries\code_generator.php on line 25
**Fatal error**: require_once(): Failed opening required '' (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\home\libraries\code_generator.php on line 25
*第 25 行是require_once(realpath("./libraries/database_library.php"));
【问题讨论】:
我猜如果你没有权限打开这个文件,你也不必chmod它。 @AD7six 这就是我的怀疑。 realpath() 函数从 file1.php 正确返回,但它在 file2.php 中返回空。我想我用错了。但正确的方法是什么? @fedorqui 我在 realpath() 的 PHP 手册中注意到这一点:“正在运行的脚本必须对层次结构中的所有目录具有可执行权限,否则 realpath() 将返回 FALSE。”那么我将如何获得“权限”呢? 【参考方案1】:文件确实不存在。
错误信息如下:
警告:require_once(C:\xampp\htdocs\home\subfolder):打开流失败:
还有:
需要打开失败''
错误消息永远不会说谎(嗯,几乎永远不会),因此您正在调用:
require_once('');
Realpath 为丢失的文件返回 false
如果您将路径传递给不存在的文件,Realpath 将返回 false:
$return = realpath('this/doesnt/exist.foo'); // $return is false
因此,传递给 realpath 的参数不引用文件,这就是路径不起作用的原因。
不要过度使用真实路径
如果你去掉realpath的使用,你会发现错误信息可能很明显。猜测您正在尝试包含C:\xampp\htdocs\home\subfolder\libraries\database_library.php
- 因为这里缺少.
:
第 25 行是
require_once(realpath("./libraries/database_library.php"));
如果你只是定义一个根路径:
define('ROOT', 'C:\xampp\htdocs\home\\');
那么你可以绝对自信地使用这个常数,这些问题不会发生:
require_once(ROOT . "libraries/database_library.php");
如果您确实弄错了路径,错误消息将清楚地表明问题所在。
【讨论】:
【参考方案2】:您可以使用PHP super global variable $_SERVER['DOCUMENT_ROOT'] 获取服务器文档根目录的完整路径,例如。 /var/www/website/public.
代码可能如下所示:
require_once $_SERVER['DOCUMENT_ROOT'] . '/libraries/database_library.php';
这种方式不需要手动设置文档根路径; PHP 将始终为您提取它,并使其在服务器文档根目录中的任何 PHP 文件的 $_SERVER['DOCUMENT_ROOT'] 中可用。
【讨论】:
以上是关于如何从不同的目录 require_once?的主要内容,如果未能解决你的问题,请参考以下文章
PHP/xdebug profiler require_once 性能不佳
spl_autoload_register() 在不同的目录