php файл существует возвращает значение false, даже если файл существует в моем linux


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

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

Информация о Сом:

  • безопасный режим=выкл
  • нет символических ссылок для каталога 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()печатает /var/www/html/smic/модули/ядро/билет

Разрешение 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. Изменил файл $ на "ul.txt " (т.е. $файл = 'ul.txt ';). Это работает, ul.txt файл найден.

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

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

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

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

Author: Nicsoft, 2012-02-09

8 answers

Одного разрешения файла недостаточно для 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
 7
Author: Timothée Groleau, 2012-02-09 13:53:13

Хватаюсь здесь за соломинку...

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

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

 2
Author: FreudianSlip, 2012-02-09 13:54:00

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

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

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

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

 2
Author: Nicsoft, 2012-02-09 15:49:53

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

 1
Author: yen1k, 2012-02-09 13:56:16

Попробуйте открыть файл с помощью $file = '/upload/28/ul.txt ';

 1
Author: Userbn, 2012-02-09 14:09:00

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

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

 0
Author: Garry Welding, 2012-02-09 13:47:50

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

 0
Author: James, 2012-02-09 13:53:21

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

 0
Author: frops, 2014-09-22 13:45:18