Абсолютный путь PHP к корню

Я не могу поверить, что у PHP нет простого решения для этого простого вопроса. В ASP.NET есть знак ~, который решает эту проблему и запускает все с корневого уровня. Вот моя проблема:

localhost/MySite
   -->Admin
      -- Edit.php
   -->Class
      -- class.EditInfo.php
   -->Texts
      -- MyInfo.txt
   --ShowInfo.php

Внутри class.EditInfo.php я обращаюсь к MyInfo.txt, поэтому я определил относительный путь ../Texts/MyInfo.txt. Затем я создал объект EditInfo в Admin / Edit.php и получил доступ к Texts / MyInfo.txt - он работал нормально.

Но теперь мне нужно создать объект EditInfo в ShowInfo.php и получить доступ к Texts / MyInfo.txt, и вот в чем проблема. Поскольку я использую относительный путь в своем классе, всякий раз, когда я создаю objEditInfo и пытаюсь получить доступ к MyInfo.txt, я получаю сообщение об ошибке «Файл не существует».

Теперь я ищу что-то, что эквивалентно ~ / Texts / MyInfo.txt из ASP.NET. Есть ли что-нибудь подобное ??? Или мне нужно указать путь с условием if / else?


ОБНОВЛЕНИЕ:

Я использовал $ _SERVER ['DOCUMENT_ROOT']. Я использовал подпапку, в которой находился мой настоящий веб-сайт. Поэтому мне пришлось использовать $ _SERVER ['DOCUMENT_ROOT'] ./ mySite, а затем добавить к нему остальную часть адреса (/Texts/MyInfo.php).


person SZT    schedule 22.07.2012    source источник
comment
Создайте константу с абсолютным путем к корню и используйте ее   -  person zerkms    schedule 23.07.2012
comment
возможный дубликат PHP как найти корень приложения?   -  person Gordon    schedule 23.07.2012


Ответы (8)


Создайте константу с абсолютным путем к корню, используя define в ShowInfo.php:

define('ROOTPATH', __DIR__);

Или PHP ‹= 5.3

define('ROOTPATH', dirname(__FILE__));

Теперь используйте это:

if (file_exists(ROOTPATH.'/Texts/MyInfo.txt')) {
  // ...
}

Или используйте DOCUMENT_ROOT, определенный в $_SERVER:

if (file_exists($_SERVER['DOCUMENT_ROOT'].'/Texts/MyInfo.txt')) {
  // ...
}
person Besnik    schedule 22.07.2012
comment
Можем ли мы использовать ROOTPATH ​​для href (тега)? - person Az.Youness; 29.02.2016
comment
@BBeta Непонятно, что вы имеете в виду, но не должно быть никакой разницы, где вы его используете. Приведенный выше код просто сохраняет путь как строку / константу. Затем вы можете вспомнить его и использовать при необходимости. - person Phill Healey; 11.04.2016
comment
Но разве это не приведет к сбою при доступе из Admin / Edit.php? _ _ DIR _ _ будет указывать на / path / to / site / Admin, поэтому он будет пытаться получить доступ к / path / to / site / Admin / Texts вместо / path / to / site /text. - person Marlon; 15.10.2016

В PHP есть глобальная переменная, содержащая различные детали, относящиеся к серверу. Это называется $ _SERVER. Он также содержит корень:

 $_SERVER['DOCUMENT_ROOT']

Единственная проблема заключается в том, что записи в этой переменной предоставляются веб-сервером, и нет гарантии, что все веб-серверы их предлагают.

person Razvan    schedule 22.07.2012

Всегда лучше начинать любой собственный проект PHP с файла начальной загрузки, в котором вы определяете наиболее часто используемые пути как константы на основе значений, извлеченных из $_SERVER. Это должно значительно упростить перенос ваших проектов или частей вашего проекта на другой сервер или в другой каталог на сервере.

Вот как я определяю свои корневые пути:

define("LOCAL_PATH_ROOT", $_SERVER["DOCUMENT_ROOT"]);
define("HTTP_PATH_ROOT", isset($_SERVER["HTTP_HOST"]) ? $_SERVER["HTTP_HOST"] : (isset($_SERVER["SERVER_NAME"]) ? $_SERVER["SERVER_NAME"] : '_UNKNOWN_'));

Путь LOCAL_PATH_ROOT - это корень документа. Путь HTTP_PATH_ROOT является эквивалентом при доступе к тому же пути через HTTP.

На этом этапе преобразование любого локального пути в путь HTTP можно выполнить с помощью следующего кода:

str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, $my_path)

Если вы хотите обеспечить совместимость с серверами на базе Windows, вам также необходимо заменить разделитель каталогов на разделитель URL-адресов:

str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, str_replace(DIRECTORY_SEPARATOR, '/', $my_path))

Вот полный код начальной загрузки, который я использую для шаблона PHP PowerTools:

defined('LOCAL_PATH_BOOTSTRAP') || define("LOCAL_PATH_BOOTSTRAP", __DIR__);

// -----------------------------------------------------------------------
// DEFINE SEPERATOR ALIASES
// -----------------------------------------------------------------------
define("URL_SEPARATOR", '/');
define("DS", DIRECTORY_SEPARATOR);
define("PS", PATH_SEPARATOR);
define("US", URL_SEPARATOR);

// -----------------------------------------------------------------------
// DEFINE ROOT PATHS
// -----------------------------------------------------------------------
define("RELATIVE_PATH_ROOT", '');
define("LOCAL_PATH_ROOT", $_SERVER["DOCUMENT_ROOT"]);
define("HTTP_PATH_ROOT",
        isset($_SERVER["HTTP_HOST"]) ?
        $_SERVER["HTTP_HOST"] : (
        isset($_SERVER["SERVER_NAME"]) ?
        $_SERVER["SERVER_NAME"] : '_UNKNOWN_'));

// -----------------------------------------------------------------------
// DEFINE RELATIVE PATHS
// -----------------------------------------------------------------------
define("RELATIVE_PATH_BASE",
        str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, getcwd()));
define("RELATIVE_PATH_APP", dirname(RELATIVE_PATH_BASE));
define("RELATIVE_PATH_LIBRARY", RELATIVE_PATH_APP . DS . 'vendor');
define("RELATIVE_PATH_HELPERS", RELATIVE_PATH_BASE);
define("RELATIVE_PATH_TEMPLATE", RELATIVE_PATH_BASE . DS . 'templates');
define("RELATIVE_PATH_CONFIG", RELATIVE_PATH_BASE . DS . 'config');
define("RELATIVE_PATH_PAGES", RELATIVE_PATH_BASE . DS . 'pages');
define("RELATIVE_PATH_ASSET", RELATIVE_PATH_BASE . DS . 'assets');
define("RELATIVE_PATH_ASSET_IMG", RELATIVE_PATH_ASSET . DS . 'img');
define("RELATIVE_PATH_ASSET_CSS", RELATIVE_PATH_ASSET . DS . 'css');
define("RELATIVE_PATH_ASSET_JS", RELATIVE_PATH_ASSET . DS . 'js');

// -----------------------------------------------------------------------
// DEFINE LOCAL PATHS
// -----------------------------------------------------------------------
define("LOCAL_PATH_BASE", LOCAL_PATH_ROOT . RELATIVE_PATH_BASE);
define("LOCAL_PATH_APP", LOCAL_PATH_ROOT . RELATIVE_PATH_APP);
define("LOCAL_PATH_LIBRARY", LOCAL_PATH_ROOT . RELATIVE_PATH_LIBRARY);
define("LOCAL_PATH_HELPERS", LOCAL_PATH_ROOT . RELATIVE_PATH_HELPERS);
define("LOCAL_PATH_TEMPLATE", LOCAL_PATH_ROOT . RELATIVE_PATH_TEMPLATE);
define("LOCAL_PATH_CONFIG", LOCAL_PATH_ROOT . RELATIVE_PATH_CONFIG);
define("LOCAL_PATH_PAGES", LOCAL_PATH_ROOT . RELATIVE_PATH_PAGES);
define("LOCAL_PATH_ASSET", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET);
define("LOCAL_PATH_ASSET_IMG", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET_IMG);
define("LOCAL_PATH_ASSET_CSS", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET_CSS);
define("LOCAL_PATH_ASSET_JS", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET_JS);

// -----------------------------------------------------------------------
// DEFINE URL PATHS
// -----------------------------------------------------------------------
if (US === DS) { // needed for compatibility with windows
    define("HTTP_PATH_BASE", HTTP_PATH_ROOT . RELATIVE_PATH_BASE);
    define("HTTP_PATH_APP", HTTP_PATH_ROOT . RELATIVE_PATH_APP);
    define("HTTP_PATH_LIBRARY", false);
    define("HTTP_PATH_HELPERS", false);
    define("HTTP_PATH_TEMPLATE", false);
    define("HTTP_PATH_CONFIG", false);
    define("HTTP_PATH_PAGES", false);
    define("HTTP_PATH_ASSET", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET);
    define("HTTP_PATH_ASSET_IMG", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET_IMG);
    define("HTTP_PATH_ASSET_CSS", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET_CSS);
    define("HTTP_PATH_ASSET_JS", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET_JS);
} else {
    define("HTTP_PATH_BASE", HTTP_PATH_ROOT .
            str_replace(DS, US, RELATIVE_PATH_BASE));
    define("HTTP_PATH_APP", HTTP_PATH_ROOT .
            str_replace(DS, US, RELATIVE_PATH_APP));
    define("HTTP_PATH_LIBRARY", false);
    define("HTTP_PATH_HELPERS", false);
    define("HTTP_PATH_TEMPLATE", false);
    define("HTTP_PATH_CONFIG", false);
    define("HTTP_PATH_PAGES", false);
    define("HTTP_PATH_ASSET", HTTP_PATH_ROOT .
            str_replace(DS, US, RELATIVE_PATH_ASSET));
    define("HTTP_PATH_ASSET_IMG", HTTP_PATH_ROOT .
            str_replace(DS, US, RELATIVE_PATH_ASSET_IMG));
    define("HTTP_PATH_ASSET_CSS", HTTP_PATH_ROOT .
            str_replace(DS, US, RELATIVE_PATH_ASSET_CSS));
    define("HTTP_PATH_ASSET_JS", HTTP_PATH_ROOT .
            str_replace(DS, US, RELATIVE_PATH_ASSET_JS));
}

// -----------------------------------------------------------------------
// DEFINE REQUEST PARAMETERS
// -----------------------------------------------------------------------
define("REQUEST_QUERY",
        isset($_SERVER["QUERY_STRING"]) && $_SERVER["QUERY_STRING"] != '' ?
        $_SERVER["QUERY_STRING"] : false);
define("REQUEST_METHOD",
        isset($_SERVER["REQUEST_METHOD"]) ?
        strtoupper($_SERVER["REQUEST_METHOD"]) : false);
define("REQUEST_STATUS",
        isset($_SERVER["REDIRECT_STATUS"]) ?
        $_SERVER["REDIRECT_STATUS"] : false);
define("REQUEST_PROTOCOL",
        isset($_SERVER["HTTP_ORIGIN"]) ?
        substr($_SERVER["HTTP_ORIGIN"], 0,
        strpos($_SERVER["HTTP_ORIGIN"], '://') + 3) : 'http://');
define("REQUEST_PATH",
        isset($_SERVER["REQUEST_URI"]) ?
        str_replace(RELATIVE_PATH_BASE, '',
        $_SERVER["REQUEST_URI"]) : '_UNKNOWN_');
define("REQUEST_PATH_STRIP_QUERY",
        REQUEST_QUERY ?
        str_replace('?' . REQUEST_QUERY, '', REQUEST_PATH) : REQUEST_PATH);

// -----------------------------------------------------------------------
// DEFINE SITE PARAMETERS
// -----------------------------------------------------------------------
define("PRODUCTION", false);
define("PAGE_PATH_DEFAULT", US . 'index');
define("PAGE_PATH",
        (REQUEST_PATH_STRIP_QUERY === US) ?
        PAGE_PATH_DEFAULT : REQUEST_PATH_STRIP_QUERY);

Если вы добавите приведенный выше код в свой собственный проект, вывод всех пользовательских констант на этом этапе (что вы можете сделать с помощью get_defined_constants(true), должен дать результат, который будет выглядеть примерно так:

array (
  'LOCAL_PATH_BOOTSTRAP' => '/var/www/libraries/backend/Data/examples',
  'URL_SEPARATOR' => '/',
  'DS' => '/',
  'PS' => ':',
  'US' => '/',
  'RELATIVE_PATH_ROOT' => '',
  'LOCAL_PATH_ROOT' => '/var/www',
  'HTTP_PATH_ROOT' => 'localhost:8888',
  'RELATIVE_PATH_BASE' => '/libraries/backend/Data/examples',
  'RELATIVE_PATH_APP' => '/libraries/backend/Data',
  'RELATIVE_PATH_LIBRARY' => '/libraries/backend/Data/vendor',
  'RELATIVE_PATH_HELPERS' => '/libraries/backend/Data/examples',
  'RELATIVE_PATH_TEMPLATE' => '/libraries/backend/Data/examples/templates',
  'RELATIVE_PATH_CONFIG' => '/libraries/backend/Data/examples/config',
  'RELATIVE_PATH_PAGES' => '/libraries/backend/Data/examples/pages',
  'RELATIVE_PATH_ASSET' => '/libraries/backend/Data/examples/assets',
  'RELATIVE_PATH_ASSET_IMG' => '/libraries/backend/Data/examples/assets/img',
  'RELATIVE_PATH_ASSET_CSS' => '/libraries/backend/Data/examples/assets/css',
  'RELATIVE_PATH_ASSET_JS' => '/libraries/backend/Data/examples/assets/js',
  'LOCAL_PATH_BASE' => '/var/www/libraries/backend/Data/examples',
  'LOCAL_PATH_APP' => '/var/www/libraries/backend/Data',
  'LOCAL_PATH_LIBRARY' => '/var/www/libraries/backend/Data/vendor',
  'LOCAL_PATH_HELPERS' => '/var/www/libraries/backend/Data/examples',
  'LOCAL_PATH_TEMPLATE' => '/var/www/libraries/backend/Data/examples/templates',
  'LOCAL_PATH_CONFIG' => '/var/www/libraries/backend/Data/examples/config',
  'LOCAL_PATH_PAGES' => '/var/www/libraries/backend/Data/examples/pages',
  'LOCAL_PATH_ASSET' => '/var/www/libraries/backend/Data/examples/assets',
  'LOCAL_PATH_ASSET_IMG' => '/var/www/libraries/backend/Data/examples/assets/img',
  'LOCAL_PATH_ASSET_CSS' => '/var/www/libraries/backend/Data/examples/assets/css',
  'LOCAL_PATH_ASSET_JS' => '/var/www/libraries/backend/Data/examples/assets/js',
  'HTTP_PATH_BASE' => 'localhost:8888/libraries/backend/Data/examples',
  'HTTP_PATH_APP' => 'localhost:8888/libraries/backend/Data',
  'HTTP_PATH_LIBRARY' => false,
  'HTTP_PATH_HELPERS' => false,
  'HTTP_PATH_TEMPLATE' => false,
  'HTTP_PATH_CONFIG' => false,
  'HTTP_PATH_PAGES' => false,
  'HTTP_PATH_ASSET' => 'localhost:8888/libraries/backend/Data/examples/assets',
  'HTTP_PATH_ASSET_IMG' => 'localhost:8888/libraries/backend/Data/examples/assets/img',
  'HTTP_PATH_ASSET_CSS' => 'localhost:8888/libraries/backend/Data/examples/assets/css',
  'HTTP_PATH_ASSET_JS' => 'localhost:8888/libraries/backend/Data/examples/assets/js',
  'REQUEST_QUERY' => false,
  'REQUEST_METHOD' => 'GET',
  'REQUEST_STATUS' => false,
  'REQUEST_PROTOCOL' => 'http://',
  'REQUEST_PATH' => '/',
  'REQUEST_PATH_STRIP_QUERY' => '/',
  'PRODUCTION' => false,
  'PAGE_PATH_DEFAULT' => '/index',
  'PAGE_PATH' => '/index',
)
person John Slegers    schedule 08.11.2014

Вы можете получить доступ к переменной $ _SERVER ['DOCUMENT_ROOT']:

<?php 
   $path = $_SERVER['DOCUMENT_ROOT'];
   $path .= "/subdir1/yourdocument.txt";
?>
person Jeremy D    schedule 22.07.2012
comment
Вам, вероятно, лучше определить $ _SERVER ['DOCUMENT_ROOT'] как константу, а затем использовать $path = DOCROOT . '/subdir1/yourdocument.txt'; - person Jochem Kuijpers; 07.06.2014

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

<?php

define('SITE_ROOT', dirname(__FILE__));

$file_path = SITE_ROOT . '/Texts/MyInfo.txt';

?>

Затем включите config.php в каждый сценарий точки входа и укажите SITE_ROOT в своем коде вместо того, чтобы указывать относительный путь.

person Jon Gauthier    schedule 22.07.2012
comment
Прочитав все эти ответы, я чувствую себя новичком. В любом случае, не могли бы вы привести пример, как я могу использовать этот SITE_ROOT в моем файле .php? Могу я просто написать так: SITE_ROOT. Тексты / Info.txt ?? - person SZT; 23.07.2012
comment
Конечно, как только это будет определено. Но имейте в виду, что dirname возвращает путь без косой черты в конце, поэтому вы Вам потребуется косая черта в начале всех строк, которые вы присоедините к нему: SITE_ROOT . "/Texts/Info.txt". - person Jon Gauthier; 23.07.2012
comment
Единственная проблема, которую я обнаружил с этим методом, заключается в том, что вам по-прежнему нужен относительный путь к вашему конфигурационному файлу, поэтому вы все равно будете использовать относительные пути. - person Thomas Williams; 12.08.2016

используйте dirname(__FILE__) в глобальном файле конфигурации.

person Martin    schedule 22.07.2012
comment
Или просто DIR, если вы используете PHP ›= 5.3 - person solarc; 23.07.2012

Лучший способ Использование dirname (). Поскольку SERVER ['DOCUMENT_ROOT'] не работает на всех серверах, а также возвращает рабочий путь сервера.

$root = dirname( __FILE__ );

$root = __DIR__;

$filePath = realpath(dirname(__FILE__));

$rootPath = realpath($_SERVER['DOCUMENT_ROOT']);

$htmlPath = str_replace($root, '', $filePath);
person venkatskpi    schedule 25.09.2017

Это мой способ найти rootstart. Создайте при запуске ROOT файл с именем mainpath.php

<?php 
## DEFINE ROOTPATH
$check_data_exist = ""; 

$i_surf = 0;

// looking for mainpath.php at the aktiv folder or higher folder

while (!file_exists($check_data_exist."mainpath.php")) {
  $check_data_exist .= "../"; 
  $i_surf++;
  // max 7 folder deep
  if ($i_surf == 7) { 
   return false;
  }
}

define("MAINPATH", ($check_data_exist ? $check_data_exist : "")); 
?>

Для меня это лучший и самый простой способ их найти. ^^

person Angelo - Fabiano Forni    schedule 16.02.2021