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

Solutions Collecting From Web of "PHP включает относительный путь"

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

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

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

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

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

в test.php будет установлен ваш корень на уровне /root/ level.

 include(ROOT_PATH.'config.php'); 

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

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

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

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

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

 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; } 

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