У меня есть несколько вызовов 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:
Оказывается, ответ был супер простым, но совершенно нелогичным:
При создании (конкатенировании) путей для итерации я по какой-то причине жестко закодировал конечную косую черту, как путь выше заканчивается на img/002.JPG/
с косой чертой в конце. Исправление этой косой черты зафиксировало ошибку. Это также объясняет, почему в каталогах (которые должны иметь завершающие косые черты) это не сбой, только файлы (а это не так).
is_dir()
из того, что говорит документация PHP, is_dir()
должен возвращать TRUE
если указанный путь представляет собой существующий каталог; и FALSE
во всех остальных случаях, в том числе, если указанный файл не существует (что img/002.JPG/
не поддерживает).
Поэтому я все еще немного озадачен тем, почему он не просто возвращает FALSE
так, как он использовался в PHP 5.2, но вместо этого делает это довольно заумным и откровенно просто совершенно неправильным утверждением, что файл не находится в разрешенном пути … но по крайней мере, теперь это работает снова.