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