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

Получение рута в папке сайта не сложно, но я пытаюсь получить папку, в которой расположены все сайты, а не корневую папку определенного сайта. Я использовал приведенный ниже код, но натолкнулся на случай, затрагивающий $ 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;

0

Решение

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

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

0

Другие решения

С использованием «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
0

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

$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;
0
По вопросам рекламы [email protected]