2011-07-11 3 views
9

Я программировал в PHP уже несколько лет, и никогда не столкнулся с этой ошибкой раньше.Require_once Ошибка PHP

Вот мой widget.php файл:

require_once('fruit.php'); 
echo "I am compiling just fine!!!"; 

И мой fruit.php файл:

$bVar = true; 

Когда эти два файла выглядеть следующим образом ^, то все компилируется без ошибок и я получаю «Я компилирую только штраф !!!« сообщение успеха.

Теперь минута я двигаю fruit.php файл один каталог на уровень выше, и изменить widget.php файл, чтобы отразить реструктуризации каталога:

require_once('../fruit.php'); 
echo "I am compiling just fine!!!"; 

Теперь все внезапно, я получить PHP предупреждения & фатальные ошибки:

Warning: require_once(../fruit.php) [function.require-once]: failed to open stream: No such file or directory in /webroot/app/widget.php on line 1 

Fatal error: require_once() [function.require]: Failed opening required '../fruit.php' (include_path='.:/usr/local/php5/lib/php') in /webroot/app/widget.php on line 1 

За все годы работы с PHP, я не имею никогда себе ru require_once() так неудачно. Есть идеи?!?!

+5

Единственное, о чем я могу сразу подумать, вы проверили разрешения пользователя веб-сервера для родительской папки?Вы можете подтвердить операционную систему, веб-сервер и т. Д. Я вижу, что это актуально в этом случае. –

+0

+1 для Джеффа ... имеет ли пользователь веб-сервера доступ к родительскому каталогу. – sdolgy

+0

@Jeff Parker - нет, что никогда не приходило мне в голову; Мне нужно было бы вызвать хозяина и спросить. Будет ли это переменной в Apache или PHP? Какой файл и имя переменной? И спасибо! – Kim

ответ

1

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

http://php.net/manual/en/function.set-include-path.php

+0

спасибо за предложение, и я рассмотрю его сегодня утром, но у меня никогда не было проблемы с использованием «./» или «../» перед тем, как в require_once(), и ни разу не пришлось использовать функцию set_include_path(), чтобы исправлять такие проблемы, как это раньше. Еще раз спасибо! – Kim

+0

IMHO, set include path не имеет значения, когда вы непосредственно включаете файл, как @kim делает, поправьте меня, если я ошибаюсь. – Kumar

+0

Может быть, если кто-то сделал chdir или что-то в этом роде. –

-1
require_once('fruit.php'); 

Это ищет fruit.php в том же каталоге, widget.php не находится, независимо от того, что текущий рабочий каталог.

require_once('../fruit.php'); 

Это ищет fruit.php в директории выше директории тока, а не в каталоге выше одного widget.php находится.

+0

Нет, это неправильно. 'fruit.php' пытается разрешить путь, используя' include_path' (напомним, что текущий рабочий каталог '.' обычно является его частью), а' ../ fruit.php' пытается его решить _only_, используя текущую работу каталог. – KingCrunch

+0

Дополнительно: Вызов 'fruit.php' не означает, что текущий каталог работы указывает на каталог, где' fruit.php': 'php some/directory/fruit.php'. Или он изменился с помощью 'chwd()' – KingCrunch

13

Может быть, вы в неправильном рабочем каталоге. Его плохая идея полагаться на него (за исключением того, что вы явно хотите получить к нему доступ) в любом случае. Используйте

require __DIR__ . '/../fruit.php'; 

или с предварительной 5.3

require dirname(__FILE__) . '/../fruit.php'; 

Напомним, что пути, начиная с .. или . являются не разрешенное против включения-пути, но только по отношению к текущей рабочей директории.

0

Я знаю, что вопрос старый, но он по-прежнему имеет значение.

По моему опыту, "open_basedir" directive, скорее всего, вызовет эту проблему.

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