6

is_dir在一个页面上有几个电话。他们一直工作没有问题。

几天前,托管公司将 PHP 从 5.2 升级到 5.3。从那时起,我所有的电话is_dir都导致了以下错误(消息):

Warning: is_dir(): open_basedir restriction in effect.
File(/home/virtual/domain.com/public_html/galleries/img/002.JPG/)
is not within the allowed path(s):
(/home/virtual/domain.com:/home/virtual/_tmp)
in /home/virtual/domain.com/public_html/index.php on line 201

这让我很困惑。

显然,根据错误消息(php_info以及),目录/home/virtual/domain.com(没有尾部斜杠,因此包括子目录)包含/启用open_basedir,并且is_dir尝试迭代的文件都位于该文件夹下的子文件夹中。那么为什么它们不在允许的路径之内呢?显然他们是!

奇怪的是,这个错误似乎只在is_dir返回 false 时出现,即文件不是文件夹,而是普通文件时。它似乎可以遍历目录而不会引发错误。

以前在这里发布的类似问题:Open_basedir 限制奇怪(未找到解决方案)。

有人有想法么?

(注意:更改 PHP 设置不是一个选项,因为这是一个共享主机,我没有任何管理员访问权限)

4

2 回答 2

4

原来答案非常简单,但完全不合逻辑:

在创建(连接)要遍历的路径时,出于某种原因,我硬编码了一个尾部斜杠——注意上面的路径是如何img/002.JPG/以斜杠结尾的。删除此斜杠修复了错误。这也解释了为什么它没有在目录(应该有斜杠)上失败,只有文件(不是)。

按照 PHP 文档的说明,如果指定的路径代表现有目录,则is_dir()应该返回;TRUE在所有其他情况下,FALSE包括指定的文件不存在(不存在img/002.JPG/)。

所以我仍然有点困惑,为什么它不只是返回FALSE它在 PHP 5.2 中的方式,而是使这个相当深奥,坦率地说只是完全错误的声明,即文件不在允许的路径内……但在至少它现在又可以工作了。

于 2012-07-25T09:19:44.440 回答
4

当您打开或检查以存在文件作为前缀且不存在部分作为后缀的路径时,会触发 PHP 中未修复的错误。在您的示例中,/home/virtual/domain.com/public_html/galleries/img/002.JPG存在后缀不存在的部分/(路径中的斜杠)。

有解释说这不是错误:“这是预期的行为。不存在的非路径(带有斜杠的路径)被认为在 basedir 之外。”,但我不这么认为。仅当路径的第一部分是现有文件时才会触发此错误。

PHP 错误:

于 2013-03-15T15:35:01.297 回答