Неустранимая ошибка PHP: не удалось открыть - PullRequest
8 голосов
/ 25 марта 2011

У меня есть скрипт с именем 'sess-start.php', который находится в каталоге / include в моем каталоге httpdocs.

Мой сайт продолжает выдавать эту ошибку: \

[Пт 25 марта 14:52:24 2011] [ошибка] [клиент 12.3.3.3] PHP фатальная ошибка: require () [function.require]: Не удалось открыть '/Includes/sess-start.php' (include_path = '.:') в /var/www/vhosts/site.com/httpdocs/page.php в строке 4 рефери: https://www.site.com/

, хотя www.site.com/includes существует. Что дает!

Редактировать 1

Это включает / требует, которые могут сами содержать дополнительные требования или включать заявления. Относительные пути НЕ БУДУТ РАБОТАТЬ, поэтому, пожалуйста, не предлагайте такие.

Мой файл .htaccess уже указывает все включаемые пути к корневому каталогу сайта:

php_value include_path .: / Вар / WWW / виртуальных доменов / site.com / httpdocs

Редактировать 2

Не все мои включенные или требуемые сценарии содержатся в одном каталоге, поэтому предложение просто поместить каталог / include в include_path также отменяется (и, в свою очередь, также вызывает проблемы на машине с Windows)

Обновление

Возможно, некоторые разъяснения на примере из реальной жизни могут помочь решить проблему, для которой наша команда пытается решить:

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

Затем, в записи db (или в каком-либо другом действии), если все идет гладко, участник, возможно, предпочел, прежде чем получать подтверждение по электронной почте, основанное на его / ее действии. Этот оператор require находится во 2-м требовании (db insert), но находится в другом каталоге, чем второй, что вызывает конфликт, поскольку первый файл неправильно обрабатывает ссылки.

Жесткое кодирование абсолютного пути или даже установка подходящего пути включения на странице - это нормально, но тогда это отключает возможность нашей команды устанавливать горячую ссылку между файлами с Dreamweaver (или любой другой программой, которая делает то же самое), потому что она не распознает «root сайта» при работе в тестовой среде.

Ответы [ 3 ]

8 голосов
/ 25 марта 2011

Вашему пути предшествует косая черта (/).

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

Удалите косую черту из своего пути, и у вас должен быть путь, относящийся к page.php.

РЕДАКТИРОВАТЬ: Поскольку относительные пути не будут работать, вы можете использовать dirname(__FILE__), чтобы получить абсолютный путь к каталогу, в котором находится текущий файл.

require(dirname(__FILE__) . '/includes/sess-start.php');
6 голосов
/ 25 марта 2011

Вам нужно использовать относительный путь. Когда ваши имена файлов начинаются с / PHP будет предполагать, что вы имеете в виду корневой каталог. Правильный префикс ./

include('./includes/sess-start.php');

Если вы хотите, чтобы все ваши пути были относительно корня документа, то это обычный метод:

include("$_SERVER[DOCUMENT_ROOT]/includes/sess-start.php");
1 голос
/ 25 марта 2011

Похоже, вам нужно удалить начальную косую черту из строки включения.

Редактировать: Для решения ваших проблем.В файле prepend или некотором общем включении создайте константу, такую ​​как DOCROOT.Вы можете динамически определить это по вашей __FILE__ константе.

Тогда:

include(DOCROOT.'myfile.php');

Лично я бы попытался настроить все, чтобы избежать такого рода вещей.

...