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
В качестве еще одного теста я попытался найти другой файл, исключающий путь в каталоге "билет", файл не был распознан.
Я бьюсь головой...
Любой совет приветствуется.
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
Хватаюсь здесь за соломинку...
Попробуйте su-apache (или независимо от того, какой пользователь работает на вашем веб-сервере как.. apache2, www-данные и т. Д.), А затем перейдите в каталог.
Существуют ли какие-либо файлы .htaccess или какие-либо другие ограничения в вашей конфигурации apache?
Ну и дела, это был симпатичный туф. Я всегда проверяю, когда копирую что-либо из Интернета, чтобы сначала вставить это в обычный текстовый редактор, чтобы удалить все странные/скрытые символы, затем снова скопировать все, что угодно, и вставить его в мой инструмент разработки.
Как я уже упоминал где-то в комментарии, я сделал pwd и скопировал текст с моего виртуального сервера на свой osx. Но о чем я не думал/не знал, так это о том, что странные/скрытые символы могут следовать, если я сделаю это с моего сервера Linux, поэтому я не позаботился о том, чтобы скопировать все через текстовый редактор.
Я вспомнил, что у меня была проблема довольно давно, когда я копировал из Интернета, и подумал, что это может быть похожая проблема. Я открыл свой скрипт в шестнадцатеричном редакторе. И что я нашел... "/вар" выглядел так: "ï"¿/вар". Удаление странных символов устранило проблему.
Спасибо всем вам за ваши комментарии выше. Надеюсь, что это может помочь кому-то еще, и, возможно, это помогло мне, даже не зная об этом (так как я много сделал вещей, основанных на ваших комментариях).
Как насчет прав доступа к папке?
путь $file = 'file:///var/www/html/smic/upload/28/ul.txt';
неверен.
Попробуйте скопировать php-скрипт в папку загрузки и file='28/ul.txt';
.
Папка должна быть читаемой.
Попробуйте открыть файл с помощью $file = '/upload/28/ul.txt ';
Из php.net руководство: "При сбое выдается предупреждение E_". убедитесь, что для отчетов об ошибках установлен уровень, при котором будут отображаться предупреждения, и попробуйте это сделать.
Также "Эта функция возвращает значение FALSE для файлов, недоступных из-за ограничений безопасного режима. Однако эти файлы все еще могут быть включены, если они расположены в safe_mode_include_dir.". Вы не работаете в безопасном режиме php, не так ли? phpinfo() должен вам сказать.
Где находится ваш php-файл? Если в папке "html", то используйте относительный путь, например $file = "smic/upload/28/ul.txt";
Возможно, в имени файла есть символ пробела. Это важно.