PHP: допустимый путь open_basedir

У меня есть несколько вызовов 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, т. is_dir Когда файл не является папкой, а является обычным файлом. Кажется, что итерация по каталогам правильная, без ошибок.

Подобный вопрос, поставленный ранее здесь: Open_basedir ограничение нечетности (решение не найдено).

У кого-нибудь есть идеи?

(Примечание. Изменение настроек PHP не является вариантом, так как это общий хост, и у меня нет доступа администратора)

В PHP есть некорректная ошибка, которая запускается при открытии или проверке пути, в котором существующий файл является префиксом, а не существующей частью в качестве суффикса. В вашем примере существует существующая часть /home/virtual/domain.com/public_html/galleries/img/002.JPG с отсутствующим суффиксом / (завершающий слэш в пути).

Есть объяснение, что это не ошибка: «Это ожидаемое поведение. Отсутствующий путь, который не существует (тот, у которого есть косая черта), рассматривается вне основы. », Но я так не думаю. Эта ошибка запускается только в том случае, если первая часть пути является существующим файлом.

Ошибки PHP:

  • «Ошибка № 54419 :: is_dir () вызвана в файл с завершающим косой чертой, чтобы вызвать предупреждение, если open_basedir"
  • "Ошибка # 52065 :: Предупреждение об ограничении open_basedir при доступе к файлу в качестве каталога"

Оказывается, ответ был супер простым, но совершенно нелогичным:

При создании (конкатенировании) путей для итерации я по какой-то причине жестко закодировал конечную косую черту, как путь выше заканчивается на img/002.JPG/ с косой чертой в конце. Исправление этой косой черты зафиксировало ошибку. Это также объясняет, почему в каталогах (которые должны иметь завершающие косые черты) это не сбой, только файлы (а это не так).

is_dir() из того, что говорит документация PHP, is_dir() должен возвращать TRUE если указанный путь представляет собой существующий каталог; и FALSE во всех остальных случаях, в том числе, если указанный файл не существует (что img/002.JPG/ не поддерживает).

Поэтому я все еще немного озадачен тем, почему он не просто возвращает FALSE так, как он использовался в PHP 5.2, но вместо этого делает это довольно заумным и откровенно просто совершенно неправильным утверждением, что файл не находится в разрешенном пути … но по крайней мере, теперь это работает снова.