4

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

4

2 回答 2

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 的使用,你会发现错误信息可能很明显。猜测您正在尝试包括在内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");

而且,如果您确实弄错了路径,则错误消息将清楚地表明问题所在。

于 2013-02-08T16:04:31.220 回答
3

您可以使用PHP 超级全局变量$_SERVER['DOCUMENT_ROOT'] 来获取服务器文档根目录的完整路径,例如。/var/www/网站/公共。

代码可能如下所示:

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

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

于 2016-04-21T20:50:33.623 回答