Как включить разрешение разрешения в require_once?

Я писал веб-приложение на PHP, когда я столкнулся с странной ситуацией. Чтобы проиллюстрировать мою проблему, рассмотрите веб-приложение этой структуры:

/ index.php f1/ f1.php f2/ f2.php 

Содержание этих файлов:

index.php:

 <?php require_once("f1/f1.php"); ?> 

f1.php:

 <?php require_once("../f2/f2.php"); ?> 

f2.php: blank

теперь, когда я пытаюсь открыть index.php в моем браузере, я получаю эту ошибку:

 Warning: require_once(../f2/f2.php) [function.require-once]: failed to open stream: No such file or directory in /var/www/reqtest/f1/f1.php on line 2 Fatal error: require_once() [function.require]: Failed opening required '../f2/f2.php' (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/reqtest/f1/f1.php on line 2 

Есть ли что-то очевидное, что мне не хватает? как включить пути в PHP?


Прежде чем я задал этот вопрос, я попытался поэкспериментировать и узнать. Я установил еще один тест, например:

 / index.php f1/ f1.php f2.php 

index.php:

 <?php require_once("f1/f1.php"); ?> 

f1.php:

 <?php require_once("f2.php"); ?> 

f2.php: blank

К моему удивлению (и полному замешательству), это получилось прекрасно!

Итак, в чем секрет разрешения пути?

PS Я видел этот вопрос , но он по-прежнему не отвечает на второй случай, который я сказал здесь.

    Если вы включаете другой файл, рабочий каталог остается там, где содержится файл.

    Ваши примеры работают по назначению.

    Изменить: второй пример работает, потому что. (фактический каталог) находится в вашем пути включения (см. сообщение об ошибке).

    Edit2: В вашем втором примере ключевым моментом вашего интереса является эта строка:

     <?php require_once("f2.php"); ?> 

    Сначала он будет выглядеть в текущем рабочем /var/www/req_path_test ( /var/www/req_path_test ), но не находит f2.php.

    В качестве резервной копии он попытается найти f2.php в вашем include_path ( '.:/usr/share/php:/usr/share/pear' ), начиная с '.' (что относится к фактическому файлу, а не к содержащему ).

    Итак, «./f2.php» работает, и требование не прерывается.

    Когда вы открываете index.php, рабочий каталог устанавливается в папку, в которую находится этот файл. И внутри insluded f1.php этот рабочий каталог не изменяется.

    Вы можете включать файлы, используя их абсолютные пути, относительно текущего файла, например:

     require_once(dirname(__FILE__).'/../../test/file.php') 

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

    Нормальная у вас старая структура

    <?php require_once("f2/f2.php"); ?>

    вместо

    <?php require_once("../f2/f2.php"); ?>

    должно сработать. Насколько я знаю, php берет пути от исходного скрипта

    Похоже, ваш сервер имеет параметр open_basedir, включенный в конфигурации PHP. Это делает невозможным включение (и открытие) файлов в папках выше вашего в структуре structur (т. Е. Вы не можете использовать ../ для перехода в структуру папок).