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
Ответы
Ответ 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;
}
Вот лучшее решение, которое я сделал об этом, вам просто нужно указать, на каком уровне вы хотите остановиться, но проблема в том, что вы должны использовать это имя папки один раз.