Получение корневого пути сервера

Получение рута в папке сайта не сложно, но я пытаюсь получить папку, в которой расположены все сайты, а не корневую папку определенного сайта. Я использовал приведенный ниже код, но натолкнулся на случай, затрагивающий $CommonPath, где он не работает из-за специфической структуры одного сайта.

Другими словами, одна из моих систем разработки для Windows имеет что-то вроде:

C:\Server\Sites\site1.loc
C:\Server\Sites\site2.loc
C:\Server\Sites\site3.loc

и другая система разработки на основе Linux имеет:

/var/www/html/site1.loc
/var/www/html/site2.loc
/var/www/html/site3.loc

и я пытаюсь получить C:\Server\Sites\ или /var/www/html/ из кода, который находится внутри подпапки или двух из этих корней. Как это сделать, не указывая, в какой подпапке создается переменная?

$SiteFolder = @end(explode(DIRECTORY_SEPARATOR, dirname(__DIR__)));
$CommonPath = str_replace($SiteFolder,"",dirname(__DIR__)) . "common" . DIRECTORY_SEPARATOR;
$ConfigPath = dirname(__DIR__) . DIRECTORY_SEPARATOR . "configuration" . DIRECTORY_SEPARATOR;
$FunctionsPath = dirname(__DIR__) . DIRECTORY_SEPARATOR . "functions" . DIRECTORY_SEPARATOR;

3 ответа

Решение

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

$dirSeparator = DIRECTORY_SEPARATOR;
$serverRoot = str_replace("/",$dirSeparator,$_SERVER['DOCUMENT_ROOT']);
$SiteFolder = end(explode($dirSeparator,$serverRoot));
$CommonPath = str_replace($SiteFolder,"",$serverRoot);

Я не уверен, почему я не смог использовать DIRECTORY_SEPARATOR напрямую, но создание переменной для него сработало. Кроме того, и, возможно, ошибка PHP, использование $_SERVER['DOCUMENT_ROOT'] на сервере Windows по-прежнему дает разделители каталогов Linux, поэтому мне пришлось выполнить str_replace() для решения этой проблемы.

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

$CommonPath = str_replace($SiteFolder,"",$serverRoot) . "common" . $dirSeparator;

Использование "оператораstfu " (@) с end() не рекомендуется, когда этого можно избежать.

Я мог бы порекомендовать строковые функции, а не временные манипуляции с массивами:

Код: ( Демо)

$document_roots = [
    "C:\Server\Sites\site1.dev",
    "C:/Server/Sites/site1",
    "/var/www/html/site1.dev"
];

foreach ($document_roots as $document_root) {
    $prepared = str_replace("\\","/",$document_root);
    echo substr($prepared,0,strrpos($prepared,"/"));
    echo " or ";
    echo preg_replace("~/[^/]*$~","",$prepared);
    echo "\n";
}

Выход:

C:/Server/Sites or C:/Server/Sites
C:/Server/Sites or C:/Server/Sites
/var/www/html or /var/www/html

Вы можете посмотреть на это:

realpath - возвращает канонизированный абсолютный путь

http://php.net/manual/en/function.realpath.php

Это вернет false, если путь / файл не существует.

<?php
   echo realpath('/windows/system32');

   echo realpath('C:\Program Files\\');
?>

Выход:

C:\WINDOWS\System32
C:\Program Files


Добавлена ​​ссылка:
Это также может помочь вам: Получить путь "Мои документы" в Windows с помощью PHP

Другие вопросы по тегам