Получение рута в папке сайта не сложно, но я пытаюсь получить папку, в которой расположены все сайты, а не корневую папку определенного сайта. Я использовал приведенный ниже код, но натолкнулся на случай, затрагивающий $ 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;
Вы можете посмотреть на это:
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
С использованием «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
Я наконец заработал, сначала создав переменную для корня сайта, затем взорвав разделитель каталогов и получив только последний бит, а затем отфильтровав его по пути. Возможно, это не самый элегантный код, но, похоже, он работает.
$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;