Подтвердить что ты не робот

PHP включает относительный путь

У меня есть файл /root/update/test.php. Там также файл, /root/connect.php; Этот файл имеет строку

include "../config.php";

В/root/update/test.php. Там код

set_include_path(".:/root");
include "connect.php";

Когда я запускаю /root/update/test.php, он находит connect.php, но не находит config.php, давая мне

PHP Warning:  include(../config.php): failed to open stream: No such file or directory in /root/connect.php on line 2
PHP Warning:  include(): Failed opening '../config.php' for inclusion (include_path='.:/root')

Это меня смущает, потому что предупреждения показывают, что я делаю все правильно - путь включения /root, и он ищет файл.. /config.php(/config.php), который существует. Может кто-нибудь прояснить это для меня? Обратите внимание, что использование абсолютных путей не является для меня вариантом, из-за развертывания на производственный сервер, к которому у меня нет доступа.

Ubuntu/Apache

4b9b3361

Ответ 1

Вы всегда можете включить его с помощью __DIR__:

include(dirname(__DIR__).'/config.php');

__DIR__ является "магическим" и возвращает каталог текущего файла без конечной косой черты. Фактически это абсолютный путь, вам просто нужно связать имя файла с __DIR__. В этом случае, поскольку нам нужно подняться в каталог, мы используем PHP dirname, который поднимается в дерево файлов, и отсюда мы можем получить доступ к config.php.

Вы также можете установить корневой путь в этом методе:

define('ROOT_PATH', dirname(__DIR__) . '/');

в test.php установит ваш корень на уровень /root/.

include(ROOT_PATH.'config.php');

Затем следует включить файл конфигурации из того, где вы хотите.

Ответ 2

Хотя я ценю, что вы считаете, что абсолютные пути не являются опцией, это лучший вариант, чем относительные пути и обновление пути включения PHP.

Используйте абсолютные пути с константой, которую вы можете установить на основе среды.

if (is_production()) {
    define('ROOT_PATH', '/some/production/path');
}
else {
    define('ROOT_PATH', '/root');
}

include ROOT_PATH . '/connect.php';

Как отмечалось, ROOT_PATH также может быть выведено из текущего пути, $_SERVER['DOCUMENT_ROOT'] и т.д.

Ответ 3

function relativepath($to){
    $a=explode("/",$_SERVER["PHP_SELF"] );
    $index= array_search("$to",$a);
    $str=""; 
    for ($i = 0; $i < count($a)-$index-2; $i++) {
        $str.= "../";
    }
    return $str;
    }

Вот лучшее решение, которое я сделал об этом, вам просто нужно указать, на каком уровне вы хотите остановиться, но проблема в том, что вы должны использовать это имя папки один раз.