如何从不同的目录 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() 在不同的目录

XSLT 如何从不同的标签级别访问属性?

使用 require_once 的路径错误

express-jwt 无法从路由目录访问 req.user

Symfony 2,autoload.php 在错误的目录中生成