Вопросик по $_SERVER['DOCUMENT_ROOT']

P
На сайте с 06.01.2009
Offline
601
523

Добрый день.


$path = $_SERVER['DOCUMENT_ROOT'];
$path .= "includ/base.php";
include_once($path);

Сайт переезжал на другой хост и перестала работать подгрузка файла.

Причина ясна, так как на новом хосте $path не заканчивается на "/".

Есть ли какое то универсальное решение, мало ли будем потом снова переезжать, или вариант только один - проверять есть ли в конце $patch - "/" ?

ps проблема не только с подгрузкой этого файла, но и остальных, кои подгружаются аналогичным путем.

LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#1

Всегда начинаю:

$path .= "/includ/base.php";

И пусть он будет, где-то // ничего страшного в этом нет. Зато таких проблем как у вас не будет.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
Апокалипсис
На сайте с 02.11.2008
Offline
391
#2

Вместо / лучше использовать еще и константу DIRECTORY_SEPARATOR (https://secure.php.net/manual/ru/dir.constants.php) (чтобы избежать проблем с будущими переездами)

Записки нищего (http://zapiskinishego.ru) - мой личный блог Услуги php программиста. Очень нужна любая работа. Не покупают? Поведенческий аудит интернет-магазина за 5000 руб. (/ru/forum/990312)
P
На сайте с 06.01.2009
Offline
601
#3
LEOnidUKG:
Всегда начинаю:

$path .= "/includ/base.php";

И пусть он будет, где-то // ничего страшного в этом нет. Зато таких проблем как у вас не будет.

Ясно, как то не догадался проверить - будет ли ошибка, если в пути будет два "//". Спасибо

M
На сайте с 04.12.2013
Offline
223
#4

postavkin, $_SERVER['DOCUMENT_ROOT'] обычно не содержит трэйлинг слэша, так что ваш код явно ошибочный. Для ваших целей эту серверную переменную нужно использовать в последнюю очередь. Обычным решением в этом случае является определение константы из файла, местоположение которого известно относительно корня, каталога приложения и т.п., при помощи магических констант. Например, если файл находится в корне, в нем можно использовать такое определение:


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

Обратите внимание, что предпочтительно различать имя каталога и путь, основанный на этом имени (у пути есть трэйлинг слэш). Для подчеркивания этого различия константа была специально названа с окончанием _PATH (а не ROOT_DIR или просто ROOT).

---------- Добавлено 12.11.2018 в 13:29 ----------

P.S. Обвес нужно хранить за пределами корня. Пример определения пути к файлам, находящимся в соседнем с корнем каталоге, из фронта, расположенного в корне:


define('INCLUDE_PATH',dirname(__DIR__).'/include/');


---------- Добавлено 12.11.2018 в 13:42 ----------

P.P.S. При подключении файлов прописываемую явно концовку имени лучше делать относительной, как у вас было. Например, если я оставлю определение пути в дефолтном виде вроде


define('INCLUDE_PATH','');

то код


include_once(INCLUDE_PATH.'base.php');

останется неизменным и позволит подключить файл из какого-нибудь «общесистемного» каталога библиотечных файлов, если определить список таковых каталогов, или из рабочего каталога.

Домены и скрипт для коротких ссылок: https://u75.ru/domains-for-shortcuts

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий