php file_exists возвращает false, даже если файл существует в моем Linux - PullRequest
4 голосов
/ 09 февраля 2012

Этот вопрос задавался много раз, но ни один из найденных ответов не помог мне.

Я пытаюсь заставить php file_exists () работать.Единственный сценарий, когда он работает, - это когда php-файл находится в том же каталоге, что и файл, для которого используется file_exist () и только с использованием имени файла (т.е. исключая путь).Но это не последующее поведение, см. Ниже.

Информация о сомах:

  • safe_mode = off
  • без символических ссылок для каталога 28
  • без пробелов в имени файла
  • Все каталоги в / var / www / html / smic / upload / 28 / имеют разрешение apache: apache 777.
  • Использование php 5.3

PHP:

echo getcwd()
clearstatcache();
$file = 'file:///var/www/html/smic/upload/28/ul.txt';
//Also tried like this
//$file = '/var/www/html/smic/upload/28/ul.txt';

if(file_exists($file)){
    echo $file." exists";
}

getcwd () prints / var / www / html / smic / modules / core / ticket

Разрешение php-скрипта и проверяемого файла: apache: apache 777.

Некоторые сведения о структуре каталогов:

[root@localhost 28]# pwd
/var/www/html/smic/upload/28

[root@localhost 28]# ls -l ul.txt
-rw-r--r--. 1 apache apache 2 Feb  9 10:50 ul.txt

[root@localhost 28]# chmod 777 ul.txt

[root@localhost 28]# ls -l ul.txt
-rwxrwxrwx. 1 apache apache 2 Feb  9 10:50 ul.txt

Поведение не изменилосьпосле изменения разрешения файла.В каталоге / 28 есть drwxr-xr-x.для пользователя apache и группы apache

Для теста я также переместил настоящий php-скрипт в / 28, предоставив ему apache: apache 777 rigths.Изменил $ file на "ul.txt" (т.е. $ file = 'ul.txt';).Это работает, файл ul.txt найден.

getcwd () печатает затем / var / www / html / smic / upload / 28

В качестве другого теста я попытался найти другой файл, исключая путь в каталоге "ticket", файлне был признан

Я бьюсь головой ...

Любой совет приветствуется.

Ответы [ 8 ]

7 голосов
/ 09 февраля 2012

Одного разрешения файла недостаточно для того, чтобы php мог оценить file_exists. процесс, который запускает php, также должен иметь разрешение для обхода всех родительских каталогов этого файла, чтобы получить к нему доступ.

Проверяйте их один за другим и проверяйте, что php может читать и вводить (r-x)

ls -ald /var
ls -ald /var/www
ls -ald /var/www/html
ls -ald /var/www/html/smic
ls -ald /var/www/html/smic/upload
ls -ald /var/www/html/smic/upload/28
2 голосов
/ 09 февраля 2012

Ну и дела, это был довольно туф.Я всегда проверяю, когда я копирую что-либо из Интернета, чтобы сначала вставить это в обычный текстовый редактор, чтобы удалить все странные / скрытые символы, затем скопировать что-нибудь еще раз и вставить в мой инструмент разработки.

Как я уже упоминал где-то в комментарии, я сделал pwd и скопировал текст с моего виртуального сервера на мой osx.Но то, о чем я не думал и не знал, было то, что странные / скрытые символы могли бы последовать, если бы я делал это с моего сервера Linux, поэтому я не был уверен, что скопировал все через texteditor.

Я вспомнил, что у меня была проблема довольно давно, когда я копировал из Интернета и подумал, что это может быть похожая проблема.Я открыл свой скрипт в шестнадцатеричном редакторе.И что я нашел ... '/ var' выглядело так: 'ï »¿/ var'.Удаление странных персонажей исправило проблему.

Спасибо всем за ваши комментарии выше.Надеюсь, что это может помочь кому-то еще, и, возможно, это помогло мне, даже не зная об этом (так как я сделал много вещей, основываясь на ваших комментариях).

2 голосов
/ 09 февраля 2012

Сцепление за соломинку здесь ...

Попробуйте su - apache (или что-то еще, что пользователь вашего веб-сервера запускает как .. apache2, www-data и т. Д.), А затем обходит каталог.

Существуют ли какие-либо файлы .htaccess, или какие-либо другие ограничения в вашей конфигурации apache?

1 голос
/ 09 февраля 2012

Попробуйте открыть файл, используя $ file = '/upload/28/ul.txt';

1 голос
/ 09 февраля 2012

как обстоят дела с правами доступа к папке?путь $file = 'file:///var/www/html/smic/upload/28/ul.txt'; неверен.Попробуйте скопировать скрипт php в папку загрузки и file='28/ul.txt';.Папка должна быть читабельной.

0 голосов
/ 22 сентября 2014

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

0 голосов
/ 09 февраля 2012

Где находится ваш php файл?Если в папке "html", то использовать относительный путь, например $file = "smic/upload/28/ul.txt";

0 голосов
/ 09 февраля 2012

Из руководства php.net: «При неудаче выдается E_WARNING».убедитесь, что для отчета об ошибках задан уровень, на котором будут отображаться предупреждения, и попробуйте его.

Кроме того, «Эта функция возвращает FALSE для файлов, недоступных из-за ограничений безопасного режима. Однако эти файлы по-прежнему могут быть включены, если они находятсяв safe_mode_include_dir. "Вы не работаете в безопасном режиме PHP, не так ли?phpinfo () должен сказать вам.

...