我在页面上拨打了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 restriction oddness(未找到解决方案)。
有人有什么想法吗?
(注意:更改PHP设置不是一个选项,因为这是一个共享主机,我没有任何管理员权限)
答案 0 :(得分:4)
当您打开或检查具有现有文件作为前缀的路径并且不存在作为后缀的部分时,会触发PHP中的不固定错误。在您的示例中,存在的部分/home/virtual/domain.com/public_html/galleries/img/002.JPG
不存在后缀/
(路径中的尾部斜杠)。
有解释说这不是一个错误:“这是预期的行为。不存在的非路径(带有斜杠的路径)被认为是在basedir之外。“,但我不这么认为。只有当路径的第一部分是现有文件时,才会触发此错误。
PHP错误:
答案 1 :(得分:3)
原来答案很简单,但完全不合逻辑:
当创建(连接)要迭代的路径时,我出于某种原因硬编码了一个尾部斜线 - 注意上面的路径如何以img/002.JPG/
结尾并在末尾带有斜杠。删除此斜杠修复了错误。这也解释了为什么它没有失败的目录(应该有尾随斜杠),只有文件(不是)。
根据PHP文档所说的,is_dir()
如果指定的路径代表现有目录,则应返回TRUE
;和FALSE
在所有其他情况下,包括指定的文件是否存在(img/002.JPG/
没有)。
所以我仍然有点疑惑为什么它不仅仅像PHP 5.2中那样返回FALSE
,而是让它变得非常深奥而坦率地说就是错误声明文件不在允许的路径中......但至少它现在再次起作用。