php include_once не работает, несмотря на наличие файла и 777 разрешений

php include_once терпит неудачу для меня с сообщением «не удалось открыть поток: Нет такого файла или каталога», несмотря на существование файла, на который он жалуется, и chmod'ing до 777, чтобы попытаться смягчить проблему.

warning: include_once () [function.include]: Не удалось открыть '../i_utility/WCHelper.php' для включения (include_path = '.: / usr / share / pear: / var / www / html / we_ /') в /var/www/i_/php/w_corner/modules/i_ers/i_ers.module в строке 6.

Из командной строки я могу cd в каталог, содержащий файл исходного кода (/ var / www / i_ / php / w_corner / modules / i_ers), и я могу записать файл о том, какой php жалуется «нет такого»: ../ i_utility / WCHelper.php

В самом деле, я могу сделать выше, после того, как пользователь apache, и может даже коснуться файла и увидеть его измененную временную метку:

-bash-3.2$ whoami apache -bash-3.2$ cd /var/www/i_/php/w_corner/modules/i_ers -bash-3.2$ ls -l ../i_utility/WCHelper.php -rwxrwxrwx 1 root root 32112 Sep 14 09:49 ../i_utility/WCHelper.php -bash-3.2$ touch ../i_utility/WCHelper.php -bash-3.2$ ls -l ../i_utility/WCHelper.php -rwxrwxrwx 1 root root 32112 Sep 27 17:08 ../i_utility/WCHelper.php 

В свете всего вышесказанного, что может привести к тому, что PHP include_once завершится с ошибкой при таких обстоятельствах?

Входящие в PHP пути являются немного интуитивно понятными, особенно когда вы кормите его относительными путями. Вы ожидали бы, что путь будет относиться к текущему файлу (как, например, с CSS), но PHP интерпретирует их как относительно текущего рабочего каталога, который обычно является каталогом, в котором находится PHP-файл точки входа (например, /var/www/my_site/index.php ).

Самое простое исправить – использовать dirname(__FILE__) , который всегда соответствует абсолютному местоположению текущего файла сценария.

Может быть, ваш скрипт запущен в неправильном каталоге?
Поместите echo '<pre>'.htmlentities(getcwd()).'</pre>'; перед включением ошибки и посмотреть, показывает ли он правильный путь.

почему бы не использовать полный путь к файлу? например.

 include_once("/var/www/i_/php/w_corner/modules/i_utility/WCHelper.php");