Ответ 1
Для PHP> = 5.3.0 попробуйте
Магические константы PHP.
__DIR__
И сделай свой путь относительным.
Для PHP <5.3.0 попробуйте
dirname(__FILE__)
У меня есть эта структура папок в моем проекте PHP. (это показано в затмениях)
-MySystem
+Code
+Data_Access
-Public_HTML
+css
+js
+Templates
-resources
Когда я пробую этот код
echo $_SERVER['DOCUMENT_ROOT']
вывод
D:/рабочее пространство
Как я могу получить путь к RootDirectory системы (MySystem
), без жесткого кодирования имени папки?
Для PHP> = 5.3.0 попробуйте
Магические константы PHP.
__DIR__
И сделай свой путь относительным.
Для PHP <5.3.0 попробуйте
dirname(__FILE__)
Когда вы говорите, что
$_SERVER['DOCUMENT_ROOT']
содержит этот путь:
D:/workspace
Тогда D:
- это то, что вы ищете, не так ли?
В этом случае вы можете взорвать строку с помощью косой черты и вернуть первую:
$pathInPieces = explode('/', $_SERVER['DOCUMENT_ROOT']);
echo $pathInPieces[0];
Это приведет к выходу корневого каталога сервера.
Обновление:. Когда вы используете константу DIRECTORY_SEPARATOR
вместо жестко скопированной косой черты ('/'
), этот код также работает под Windows.
Обновление 2: Глобальная переменная $_SERVER
не всегда доступна. Например, в командной строке (cli). Таким образом, вы должны использовать __DIR__
вместо $_SERVER['DOCUMENT_ROOT']
. __DIR__
возвращает путь к самому файлу php.
используйте функцию PHP:
Получает текущий рабочий каталог.
Я хочу указать, как Wordpress обрабатывает это:
define( 'ABSPATH', dirname(dirname(__FILE__)) . '/' );
Поскольку Wordpress очень сильно используется во всем Интернете, а также отлично работает локально, я очень доверяю этому методу.
Вы можете попробовать: $_SERVER['PATH_TRANSLATED']
цитата:
Filesystem- (не документ root-) путь к текущему сценарию, после того как сервер выполнил какое-либо виртуальное сопоставление с реальным. Примечание: Начиная с PHP 4.3.2,
PATH_TRANSLATED
больше не устанавливается неявно в SAPI Apache 2, в отличие от ситуации в Apache 1, где для него установлено то же значение, что иSCRIPT_FILENAME
серверной переменнойSCRIPT_FILENAME
когда она не заполняется Apache.
Это изменение было сделано для соответствия спецификации CGI, согласно которой PATH_TRANSLATED должен существовать, только если определеноPATH_INFO
. Пользователи Apache 2 могут использоватьAcceptPathInfo = On
внутриhttpd.conf
для определенияPATH_INFO
источник: php.net/manual
echo $pathInPieces = explode(DIRECTORY_SEPARATOR , __FILE__);
echo $pathInPieces[0].DIRECTORY_SEPARATOR;
Резюме
В этом примере предполагается, что вы всегда знаете, где находится корневая папка apache "/var/www/", и пытаетесь найти следующий путь к папке (например, "/var/www/my_website_folder"). Также это работает из скрипта или веб-браузера, поэтому есть дополнительный код.
Код PHP7
function getHtmlRootFolder(string $root = '/var/www/') {
// -- try to use DOCUMENT_ROOT first --
$ret = str_replace(' ', '', $_SERVER['DOCUMENT_ROOT']);
$ret = rtrim($ret, '/') . '/';
// -- if doesn't contain root path, find using this file loc. path --
if (!preg_match("#".$root."#", $ret)) {
$root = rtrim($root, '/') . '/';
$root_arr = explode("/", $root);
$pwd_arr = explode("/", getcwd());
$ret = $root . $pwd_arr[count($root_arr) - 1];
}
return (preg_match("#".$root."#", $ret)) ? rtrim($ret, '/') . '/' : null;
}
пример
echo getHtmlRootFolder();
Выход:
/var/www/somedir/
Подробности:
Обычно сначала пытается получить DOCUMENT_ROOT, если он содержит '/var/www/', затем использовать его, иначе получить текущий каталог (который существует внутри проекта) и получить значение следующего пути на основе счетчика пути $ root. Примечание: добавлены операторы rtrim для обеспечения возврата пути, заканчивающегося символом "/" во всех случаях. Он не проверяет, требует ли он больше /var/www/, также может возвращать/var/www/в качестве возможного ответа.