如何从不同的目录require_once?

时间:2013-02-08 15:53:42

标签: php permissions directory require require-once

我正在尝试从不同文件夹中的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"));

2 个答案:

答案 0 :(得分:3)

该文件存在。

错误消息显示为:

  

警告:require_once(C:\ xampp \ htdocs \ home \ subfolder):无法打开流:

  

无法打开所需的''

错误消息永远不会存在(好吧,几乎从不),因此你 调用:

require_once('');

Realpath为丢失的文件返回false

如果您将一条路径传递给不存在的文件,那么Realpath将返回false:

$return = realpath('this/doesnt/exist.foo'); // $return is false

因此,传递给realpath的参数不会引用文件,这就是路径不起作用的原因。

不要过度使用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");

如果你确实错误地找到了路径,那么错误信息将使问题显而易见。

答案 1 :(得分:2)

您可以使用PHP super global variable $ _SERVER [' DOCUMENT_ROOT']获取服务器文档根目录的完整路径,例如。的/ var / WWW /网站/公共

代码可能如下所示:

require_once $_SERVER['DOCUMENT_ROOT'] . '/libraries/database_library.php';

这样您就不需要手动设置文档根路径; PHP将始终为您提取并在服务器文档根目录下的任何PHP文件中的$ _SERVER [' DOCUMENT_ROOT']中提供它。