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