PHP - Корневая директория сайта

Александр Мальцев
58K
2
PHP - Корневая директория сайта
Содержание:
  1. Корень (слэш) в HTML и PHP
  2. PHP - Корень сайта
  3. Комментарии

Статья, в которой рассмотрим как в php получить путь до корня сайта. Кроме того познакомимся с тем, чем отличается абсолютный путь в PHP и HTML.

Корень (слэш) в HTML и PHP

PHP в отличие от HTML видит файловую систему глубже. В HTML корнем сайта является некоторая директория, которая определяется настройками веб-сервера. Т.е. это определённый каталог в файловой системе, начиная с которого размещаются документы (файлы) этого сайта.

Например, в HTML путь к изображению image1.jpg, которое расположено в каталоге images относительно корня сайта будет иметь следующий вид:

/images/image1.jpg

В php слэш (/) обозначает корень файловой системы, а не корень сайта.

Т.е. такая запись в php будет означать, что файл image1.jpg расположен в директории images, которая находится в корне файловой системы.

/images/image1.jpg

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

Например, на хостинге (в зависимости от хостинга путь до корня сайта может отличаться) путь к файлу будет следующим:

/home/m/mysiteru/public_html/images/image1.jpg

PHP - Абсолютный путь до файла

Например, путь к файлу сайта, который работает на веб-сервере Apache (сборка Денвер) в операционной системе Windows будет следующим:

Z:/home/mysite.ru/www/images/image1.jpg

PHP - Корень сайта

Получить корневую папку сайта в скрипте php можно используя преопределённый (глобальный) массив $_SERVER:

$_SERVER['DOCUMENT_ROOT']

PHP - Как получить корень сайта

Чтобы посмотреть путь к корневому каталогу достаточно создать любой php файл и поместить в него следующее содержимое:

<?php
// вывести корень сайта
echo $_SERVER['DOCUMENT_ROOT'];
?>

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

Например, скопируем файл image1.jpg, расположенный в корне сайта, в каталог images (/assets/images - путь от корня сайта):

<?php
// получить корень сайта
$root = $_SERVER['DOCUMENT_ROOT'];
//скопировать файл image1.png в папку images, расположенную в корне сайта
copy($root.'/image1.jpg', $root.'/assets/images/image1.jpg');
}
?>

Комментарии ()

  1. Антон
    10 декабря 2020, 00:59
    Александр, приветствую! Подскажите пожалуйста как нормально подключить другие страницы сайта через php.
    1) У меня стоит Open Server. Имеем следующую структуру сайта: itchief.ru/assets/uploadify/7/8/d/78d7690f02d327fe833be71e96372301.png.
    Проблема состоит в том, что не понимаю как указывать путь… Если я подключаю в index.php навигацию (nav.php) то все работает без проблем <?php include(«nav.php»);?>. А если я в папке keys захожу в папку content и там уже в файл key.php т.е получается путь keys/content/key.php. И в этом файле пытаюсь подключить навигацию "nav.php"
    указывая путь <?php include("/nav.php");?> то ни чего не подключается и пишется след.ошибка (Warning: include(/nav.php): failed to open stream: No such file or directory ) Якобы указан неправильно путь… Но в то же самое время css подключается просто указав путь /сss/style.css то же самое и с другими файлами которые находятся в других папках, java, img, достаточно указать слэш и путь к ним. Не понимаю как сделать так чтобы все подключалось через слэш… Либо как это вообще все подключают?
    1. Александр Мальцев
      10 декабря 2020, 06:48
      Клиент и сервер — это разные вещи.
      На сервере нужно указывать полный путь к файлу. Т.е. если вы в командной строке Windows напишите следующую строчку, то он же файл не найдёт (не откроет его в notepad):
      notepad /nav.php
      А если так, то найдёт (откроет его в notepad):
      notepad c:/openserver/domains/babr.ru/nav.php
      1. Александр Мальцев
        10 декабря 2020, 06:30
        Привет! Тут нужно либо с использованием $_SERVER['DOCUMENT_ROOT'] или dirname.

        1 способ:
        <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php');?>
        2 способ:
        <?php include(dirname(dirname(dirname(__FILE__)) ) . '/nav.php');?>
        1. Антон
          10 декабря 2020, 08:30
          Александр в очередной раз Спасибо! Но если честно не совсем понял.
          1) Это получается каждый раз из key.php и key2.php и т.д. чтобы подключить nav.php мне надо прописывать
          <?php include($_SERVER['DOCUMENT_ROOT']. "/nav.php");?>?
          2) Можете более подробно подсказать в чем разница между этими 2 способами и какой предпочтительнее?
          3) Почему к примеру в том же самом key.php остальные файлы (index.php key1.php подключаются без проблем без $_SERVER['DOCUMENT_ROOT']? Ведь по уровню вложенности к примеру nav.php и index.php находятся на одном уровне, а некоторые файлы и ниже, но все равно подключаются просто указывая путь путь относительно корня сайта: /index.php и /keys/content/key1.php. т.е не могу понять почему одни файлы в этом же документе подключаются без проблем а nav.php нужно именно путь указывать относительно сервера?
          1. Александр Мальцев
            10 декабря 2020, 15:00
            Пути к файлам можно задавать в абсолютном и относительном форматах.

            $_SERVER['DOCUMENT_ROOT'] используется для создания абсолютного пути к файлу. Он всегда возвращает путь до корня сайта. У вас оно вернёт: «c:/openserver/domains/babr.ru». Далее, нужно ещё дополнительно дописать путь от него к файлу. Например, для «nav.php», вам нужно добавить ещё «/nav.php». В результате абсолютный путь к файлу «nav.php» будет иметь следующий вид:
            $_SERVER['DOCUMENT_ROOT'] . '/nav.php'
            2 способ – это использование относительного пути. Оно строится относительно текущего расположения файла. Если файл, который вы хотите включить расположен в том же каталоге, то относительный путь к нему будет просто его имя:
            'nav.php'
            Если файл находится ниже текущего каталога, то путь к нему будет строиться так:
            'keys/content/key1.php'
            Если выше, то так:
            dirname(dirname(dirname(__FILE__)) ) . '/nav.php'
            В этой конструкции __FILE__ — это полное имя данного файла, а dirname — это функция, которая возвращает имя родительского каталога для указанного пути.
            Ещё можно так:
            include('../../nav.php');
            Или так:
            include(dirname(dirname(__DIR__)) . '/nav.php');
            Где __DIR__ — это директория данного файла.

            Тут нет лучшего способа, они просто разные.
            1. Антон
              10 декабря 2020, 16:03
              Александр ясно, Благодарю! Но не убивайте меня сразу, а лучше потихоньку!) С относительными и абсолютными путями я разобрался, но как же 3 вопрос.
              Почему к примеру в том же самом key.php остальные файлы (index.php key1.php подключаются без проблем без $_SERVER['DOCUMENT_ROOT']? Хотя я везде использую абсолютный путь?
              Т.е. Почему в файле key.php я указываю абсолютный путь относительно корня сайта /index.php и keys/content/key.php. и все подключается без проблем. А когда в этом же файле указываю точно так же абсолютный путь для nav.php он ломается? /nav.php. Этот момент не до понял. Ведь знак "/" указывает что я строю путь от корня сайта… Но почему я должен писать $_SERVER['DOCUMENT_ROOT'] возвращать путь до корня сайта, если могу указать /nav.php. Хоть убей не пойму…
              Александр, не гоните беса на меня) Просто реально не выезжаю.
              1. Александр Мальцев
                10 декабря 2020, 16:48
                Когда мы путь указываем на сервере (в php), и он начинается со слэша («/»), то это означает, что он начинается с корня файловой системы, а не с корня сайта. В Linux нет дисков, и начальный узел — это корневой системный каталог («/»). В Windows пути строятся от дисков.
                На, PHP, если «index.php» и «nav.php» расположены в корне сайта, то из «index.php» вы не сможете выполнить include файла «nav.php» используя «/», т.к. в данном случае это будет считаться от корня файловой системы, а не сайта.
                include('/nav.php');
                
                В PHP, как раз $_SERVER['DOCUMENT_ROOT'] – это и есть способ получить корень сайта.

                Но когда, вы подключаете стили, скрипты, указываете пути к php файлам (например, для форм) на сервере (в php) это обрабатываться не будет – это же для браузера. Здесь уже URL начинающийся со «/» будет указывать на корень сайта. Но это клиент, а не сервер.
                1. Антон
                  10 декабря 2020, 17:17
                  Огромное Спасибо! Доходчиво объяснили, теперь понял!) Александр так уточнение: Когда я меняю расширение файла с html на php, нуно ли в начале кода так же менять его?
                  <!DOCTYPE html>
                  <html lang="ru">
                  <head>
                  	<meta charset="UTF-8">
                      <meta http-equiv="X-UA-Compatible" content="IE=edge">
                  	<meta name="viewport" content="width=device-width, initial-scale=1.0">
                  	<title>Пример</title>
                  	<link rel="stylesheet" href="/css/style.css">
                  </head>
                  Интересует вот этот момент <!DOCTYPE html> надо ли его менять на php?
                  1. Александр Мальцев
                    11 декабря 2020, 03:54
                    Пожалуйста! Doctype предназначен для указания типа создаваемого документа. Если вы создаёте HTML5 документ, то необходимо указывать это:
                    <!doctype html>
                    
                    Мы же с помощью php создаём не какой-то другой тип документа, а HTML5. Такого документа, как php вообще нет. php — это просто сценарий, который в данном случае мы используем для формирования html кода или всего html документа.
                    1. Антон
                      11 декабря 2020, 14:42
                      Спасибо!
      2. Sergey
        28 марта 2020, 08:57
        Здравствуйте, Александр. Не знаю куда написать вопрос по PHP на вашем ресурсе (функция со строкой), поэтому пишу здесь в поисках ответа!
        вот следующая запись
        $money1 = 68.75;
        $money2 = 54.35;
        $money = $money1 + $money2;
        echo $money;
        echo "\n";
        $formatted = sprintf("%01.2f", $money);
        echo $formatted;
        
        какую роль выполняет 01 в стоке "%01.2f", $money?
        Исходя из общей записи %[argnum$][flags][width][.precision]specifier. .2f — это .precision (количество цифр после десятичной запятой)!
        — 01 — не может выступать argnum$ (отсутствует $)
        — flags может содержать 0 (дополняет число нулями, но должен быть аргумент d) — отпадает вариант
        — 1 — может выступать width (минимальное количество выводимых символов) — но не соответствует при описанных далее манипуляциях!

        Так вот, убираю 01 со строки "%01.2f", $money, или меняю его на любое другое двузначное/однозначное число — результат отображения остается неизменным: 123.1 123.10

        Сглаживается впечатления, что никакой смысловой нагрузки не несет 01 в строке "%01.2f", $money, но, скорее всего — это ошибочное представление (пример взят с учебника по РНР)!

        Внесите ясность, пожалуйста, в данную ситуацию.
        СПАСИБО!

        1. Александр Мальцев
          28 марта 2020, 14:41
          Здравствуйте! Для создания вопросов имеется соответствующий раздел.
          В форматной строке «%01.2f»:
          0 – флаг (дополняет число слева нулями);
          1 – ширина, определяющее минимальное количество символов, которое будет напечатано;
          .2 – точность для спецификатора f (числа с плавающей точкой).
          Чтобы увидеть эффект от флага 0 нужно в качестве ширины, например, установить значение 8.
          В этом случае будет выведено: 00123.10
          1. Sergey
            28 марта 2020, 14:57
            Спасибо, Александр! Ранее я не обратил внимание на эти ноли слева — потому смысл оставался непонятным!
            Сейчас, все стало на свои места! Далее, воспользуюсь ссылкой на указанный раздел!

            Хорошего дня, вам!
        Войдите, пожайлуста, в аккаунт, чтобы оставить комментарий.