2012-02-09 2 views
4

Этот вопрос задан много раз, но ни один из ответов, которые я нашел, не помог мне.php file_exists возвращает false, даже если файл существует на моем Linux

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

Som:

  • safe_mode = выкл
  • не симлинками для каталога 28
  • нет пробелов в имени файла
  • Все каталоги в/вар/WWW/HTML/СМИК/загрузки/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() печатает/вар/WWW/HTML/СМИК/модули/ядро ​​/ билет

Разрешение на PHP-скрипта и файл, подлежащий проверке, - apache: apache 777.

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

[[email protected] 28]# pwd 
/var/www/html/smic/upload/28 

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

[[email protected] 28]# chmod 777 ul.txt 

[[email protected] 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. Изменен файл $ на «ul.txt» (т. Е. $ File = 'ul.txt';). Это работает, файл ul.txt найден.

getcwd() печатает то/вар/WWW/HTML/СМИК/загрузить/28

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

Я стучал головой ...

Любые советы оценили.

+0

Какую версию php вы используете? Вы пробовали его без схемы 'file: //'? – VolkerK

+0

PHP 5.3, добавленный к моему сообщению. Я почти только пробовал без файла: // – Nicsoft

ответ

2

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

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

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

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

0

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

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

+0

Согласно моему сообщению, я не пользуюсь safe_mode. – Nicsoft

7

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

Проверьте их один за другим и проверить, что PHP можно читать и вводить (г-х)

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 
+0

Я удостоверился, что разрешение - apache: apache 777 для всех поддиректорий upp to и включительно/28 – Nicsoft

0

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

+0

Я включил эту строку для этого: getcwd() prints/var/www/html/smic/modules/core/ticket – Nicsoft

+0

В этом случае , попробуйте '$ file =" ../../../ upload/28/ul.txt ";' – James

+0

На самом деле это уже решено, см. мой собственный ответ. Файл был поврежден, и мне пришлось исправить его с помощью шестнадцатеричного редактора, чтобы удалить странные символы. Спасибо, в любом случае! – Nicsoft

2

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

Попробуйте су - апача (или любой другой пользователь ваш веб-сервер работает как .. apache2, WWW-данные и т. д.), а затем перемещение по каталогу.

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

+0

Пользователь Apache недоступен ... В любом случае, убедитесь, что файлов .htaccess нет. – Nicsoft

+0

Кроме того, я удостоверился, что разрешение - apache: apache 777 для всех поддиректориев upp и включая/28. – Nicsoft

1

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

+0

Я обновил сообщение с этой информацией. Все каталоги в/var/www/html/smic/upload/28/имеют apache: apache 777 как разрешение. Я изменил это сейчас. Никакой разницы в поведении. – Nicsoft

+0

В настоящий момент я не на Linux-системе с PHP. Я проверю это вечером. Поэтому я не уверен, если это правильно. попробуйте «./smic/upload/28/ul.txt» или «smic/upload/28/ul.txt», если скрипт php находится в папке html. – yen1k

+0

Спасибо, используя hex-редактор, я нашел странные символы, которые испортили мой файл. – Nicsoft

1

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

+0

Не работает (я написал это, но я, должно быть, ошибся, потому что он не работает, я, вероятно, проверил неправильный скрипт, удалил этот комментарий). – Nicsoft

+0

use __DIR__ constant, чтобы получить текущий каталог, после использования относительного пути к вашему ресурсу. – Userbn

+0

Спасибо, используя hex-редактор, я нашел странные символы, которые испортили мой файл. – Nicsoft

0

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

+0

Вы нашли ответ? – frops

 Смежные вопросы

  • Нет связанных вопросов^_^