PHP file_exists() возвращает false для некоторых файлов

У меня странная проблема с функцией file_exists() PHP на сервере Linux.

При использовании file_exists для проверки наличия изображения на сервере перед его редактированием иногда происходит сбой без видимой причины. Пути к файлам являются абсолютными, и я проверил их через ssh, они на 100% соответствуют указанному пути.

Изображения, которые не работают с file_exists(), все равно будут отображаться в браузере. Код не имеет значения, базовый var_dump(file_exists('/home/user/path/image.jpg')); вернет false.

Права доступа/права доступа к файлам одинаковы для всех изображений и родительских каталогов. Безопасный режим выключен. Ошибок PHP нет. Я сейчас в тупике и не знаю, что искать.

Вот как изображения лежат на сервере:

/home/user/public_html/images/location/1.jpg -- will work
/home/user/public_html/images/location2/1.jpg -- won't work
/home/user/public_html/images/location2/2.jpg -- will work

У меня есть root-доступ к серверу, поэтому, если у кого-то есть какие-либо идеи, я с радостью их опробую.

Заранее спасибо за совет, дайте мне знать, если вам нужна дополнительная информация.

EDIT: чтобы ответить на вопросы в комментариях ниже.

  • Да, изображения есть, это точно не кеширование.
  • Безопасный режим выключен (я уже упоминал об этом в своем посте).
  • Пути — это не символические ссылки, а прямые ссылки на расположение файлов на сервере.
  • Феникс, это последовательно. Рабочие файлы всегда будут работать и наоборот. Имена 1.jpg, 1.thumb.jpg и т. д., так что это не проблема со странными символами или пробелами.
[root@server ~]# ls -l /home/user/public_html/images/Hawkhurst/
total 92
-rwxr-xr-x  1 user user 24501 Aug 11  2009 1.jpg
-rwxr-xr-x  1 user user  1672 Aug 11  2009 1.thumb.jpg
-rwxr-xr-x  1 user user 14983 Aug 11  2009 2.jpg
-rwxr-xr-x  1 user user  1370 Aug 11  2009 2.thumb.jpg
-rwxr-xr-x  1 user user 17238 Aug 11  2009 3.jpg
-rwxr-xr-x  1 user user  1453 Aug 11  2009 3.thumb.jpg
-rwxr-xr-x  1 user user 14168 Aug 11  2009 4.jpg
-rwxr-xr-x  1 user user  1464 Aug 11  2009 4.thumb.jpg 
[root@server ~]#

Я пробовал с разрешениями 777 и 755, которые не имеют значения. Например, в этой папке 1 и 2 могут работать, а 3 и 4 - нет...

Я провел быстрый тест, чтобы увидеть, как работает apache/php, и они работают как никто, но это не объясняет, почему некоторые изображения работают, а некоторые — нет с одинаковыми разрешениями.

EDIT 2: Проблема решена. Не могу поверить, насколько это было глупо, некоторые имена файлов, которые вызывались из базы данных, имели пробелы в конце... Кто бы ни делал исходный сценарий, он не выполнял никакой очистки перед их сохранением.


person Ben    schedule 08.01.2011    source источник
comment
Файл вообще есть? Возможно, вы видите изображения из-за кэширования.   -  person Shamim Hafiz    schedule 08.01.2011
comment
У вас включен safe_mode?   -  person Mchl    schedule 08.01.2011
comment
Пара вопросов: в вашем примере файл, который не отображается как существующий, всегда не отображается каждый раз при запуске скрипта или это периодическая проблема? Каков пример фактического имени файла, который не работает?   -  person Phoenix    schedule 08.01.2011
comment
Спасибо @ben, это действительно помогло мне (у меня была такая же глупая проблема!). Я виню php.   -  person EladG    schedule 30.11.2012


Ответы (4)


Попробуйте запустить ls -l /home/user/public_html/images/location/ и добавьте вывод к своему вопросу.

Это, скорее всего, проблема с разрешением. PHP, вероятно, не имеет доступа для чтения к файлу.

person Christian Joudrey    schedule 08.01.2011
comment
Если вы используете PHP на веб-сервере Apache HTTPd, обратите внимание, что обычно apache работает как пользователь daemon. Проверьте, есть ли у этого конкретного пользователя необходимые разрешения. - person Amil Waduwawara; 08.01.2011

После долгих поисков в сети я сам нашел решение. Надеюсь, это будет полезно для других людей: убедитесь, что пользователь и группа, настроенные в вашем apache httpd.conf, такие же, как группа и пользователь apache.

person Sveta Oksen    schedule 25.03.2013

Возможно, в имени файла есть пробел. Это важно.

person frops    schedule 22.09.2014

У меня тоже были проблемы с получением нужного результата. Оказывается, для меня это была проблема с разрешением, расположенным в папке. Вы должны убедиться, что папки имеют разрешение eXecute для пользователя Apache. Чтобы исправить это, я просто сделал это на своем linux-box: chmod g+x csv_files

С уважением Иван

person Ivan Andersen    schedule 07.09.2016