Как включить разрешение разрешения в 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 Я видел этот вопрос, но он по-прежнему не отвечает во втором случае, о котором я говорил здесь.

Ответы

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

вместо

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

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

Ответ 4

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