【问题标题】:include_path doesn't recurse?include_path 不递归?
【发布时间】:2011-04-01 18:03:40
【问题描述】:

我有几个独立的网站,它们位于不同的目录中。对于它们共同的包含,我将它放在其余部分所在的根目录中。

user@hostname:/var/www$ ls
website_1 website_2 website_3 common_files 

我想包含一个 Zend 包,所以我有我的包含路径

ini_set("include_path", get_include_path() . ":/var/www/common_files/Zend");
require_once("Mail.php");

Mail.php 加载正常,但在某处有这一行

require_once 'Zend/Mail/Transport/Abstract.php';

这个错误

Warning: require_once(Zend/Mail/Transport/Abstract.php): failed to open stream: No such file or directory in var/www/common_files/Zend/Mail.php on line 26

所以 php 不会递归地进入包含路径的目录结构。我是否必须将 Zend 移动到每个网站目录中,说明每个包含的路径,还是什么?


BTW 摘要确实存在:

user@host:/var/www/common_files/Zend$ tree -d 
...
`-- Mail/Transport
    |-- Mail/Transport/Abstract.php
    |-- Mail/Transport/Exception.php
    |-- Mail/Transport/Sendmail.php
    `-- Mail/Transport/Smtp.php

9 directories, 32 files

【问题讨论】:

  • 尝试使用常量PATH_SEPARATOR而不是冒号...所以get_include_path() . PATH_SEPARATOR . '/var/www/common_viles/Zend');
  • 这已经困扰我太多次了。包含文件时,它从与包含文件相同的路径运行。除非它们在同一个文件夹中,否则包含文件中的任何相对路径都会导致错误。有谁知道这个问题的解决方案吗?
  • @Adrian,我认为为此使用 dirname 是常见的做法。 require_once dirname(__FILE__) . '/relative/path/../here';
  • 我想解决方案是库文件中不应包含硬编码:P
  • @Brandon 啊,是的,编译时路径看起来是绝对的,对吧?谢谢!

标签: php server-side-includes include-path


【解决方案1】:

编辑:您想要更改您的 include_path 以包含 /var/www/common_files

执行此操作后,如果有的话,什么仍然损坏?

【讨论】:

  • 第二次在哪里包含它?您引用的 require_once 行在 Zend 的 Mail.php 库文件中,而不是在我的文件中。他们打算让它以这种方式工作。
  • 如果 require_once 不在您的控制范围内,请尝试将 ini_path 更改为 /var/www/common_files 并将您的 Mail.php 更改为 Zend/Mail.php
  • 没错。 ZF 期望* Zend/ 目录位于 include_path 中的目录中。 OP 希望在他的包含路径中包含 /var/www/common_files
【解决方案2】:

愚蠢的答案:Abstract.php 存在吗?

require_once 'Mail/Transport/Abstract.php';

试试这个,因为 Mail.php 已经在 Zend 文件夹中,我猜它会寻找 /Zend/Zend/.../Abstract.php

【讨论】:

  • 我会包含它,但还有其他包含,那么有没有办法为每个文件编写包含?为什么 Zend 人在他们的文件中写入的 require_once 不能正常工作?
【解决方案3】:

看起来Zend是这里的工作目录,所以你的语句正在寻找/Zend/Zend/Mail/Transport/Abstract.php。尝试从语句中删除Zend,它应该可以正常工作。

【讨论】:

  • 它可以工作,但我不明白。如果include_path 只是/var/www/common_files 和我require_once('Mail.php'),它怎么知道把Zend 放在中间呢? Mail.php 的路径是 /var/www/common_files/Zend/Mail.php
  • 哦,我明白了。它确实递归地搜索目录! :P
  • 如果 Mail.php 与包含它的 php 文件存在于同一目录中,并且 . 在 include_path 中,则无需搜索 include_path 的其余部分即可找到它。
  • 同目录下不存在。它存在于上面的一个目录中,在一个公共目录中,所以我不必在五个不同的项目中冗余地包含它。
【解决方案4】:

您需要将包含路径设置为 Zend 文件夹所在的路径。然后你像这样包含文件

require_once 'Zend/Mail.php'

【讨论】: