Сбой php include_once несмотря на наличие файла и 777 разрешений - PullRequest
0 голосов
/ 28 сентября 2010

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

предупреждение: 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.

Из командной строки я могу перейти ккаталог, содержащий файл исходного кода (/ var / www / i_ / php / w_corner / modules / i_ers), и я могу ls файл, о котором 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 при таких обстоятельствах?

Ответы [ 3 ]

4 голосов
/ 28 сентября 2010

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

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

1 голос
/ 28 сентября 2010

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

0 голосов
/ 28 сентября 2010

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

include_once("/var/www/i_/php/w_corner/modules/i_utility/WCHelper.php");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...