PHP, как найти корень приложения?

У меня проблемы с моими файлами include. Кажется, я не могу понять, как создавать URL-адреса, когда я использую require_once ('somefile.php'). Если я попытаюсь использовать файл include в более чем одном месте, где структуры каталогов различны, я получаю сообщение об ошибке, что файл include не может быть найден.

В asp.net, чтобы получить корневой путь моего приложения, я могу использовать ~ / directory / file.aspx. Слабая косая черта всегда знает, что я ссылаюсь на корень моего сайта и нахожу файл независимо от того, где запрос поступает с моего сайта. Он всегда обращается к корню и ищет файл оттуда.

ВОПРОС: Как я могу получить корневой путь моего сайта? Как я могу сделать это, чтобы я мог повторно использовать свои файлы include из любого места моего сайта? Должен ли я использовать абсолютные пути в моих URL-адресах?

Спасибо!

Существует $_SERVER['DOCUMENT_ROOT'] который должен иметь корневой путь к вашему веб-серверу.

Изменить: если вы посмотрите на большинство основных php-программ. При использовании установщика вы обычно вводите полный путь к папке приложения. Установщик просто поместит это в файл конфигурации, который включен во все приложение. Один из вариантов – использовать файл автоматической подписи для установки переменной. другой вариант – просто include_once () конфигурационный файл на каждой странице, в которой вы нуждаетесь. Последний вариант, который я хотел бы предложить, – написать вам приложение, используя загрузку, в которой вы производите все запросы через один файл (обычно с url_rewrite). Это позволяет легко установить / включить конфигурационные переменные в одном месте и обеспечить их доступность во всех сценариях.

Обычно я храню файл config.php в каталоге ROOT , а в config.php пишу:

define('ROOT_DIR', __DIR__);

А затем просто используйте ROOT_DIR константу во всех других скриптах. Использование $_SERVER['DOCUMENT_ROOT'] не очень хорошо, потому что:

  • Это не всегда соответствует ROOT_DIR
  • Эта переменная недоступна в режиме CGI (например, если вы запускаете свои скрипты CRON)

Приятно иметь возможность использовать один и тот же код в верхней части каждого скрипта и знать, что ваша страница будет загружаться должным образом, даже если вы находитесь в подкаталоге. Я использую это, полагаясь на то, что вы знаете, что называется корневой каталог (обычно это «htdocs» или «public_html»:

 defined('SITEROOT') or define('SITEROOT', substr($_SERVER['DOCUMENT_ROOT'], 0, strrpos($_SERVER['DOCUMENT_ROOT'], 'public_html')) . 'public_html'); 

Если SITEROOT определяется последовательно, вы можете получить доступ к файлам конфигурации и / или страницам без адаптации путей по сценарию по сценарию, например, к файлу конфигурации, хранящемуся вне вашей корневой папки:

 require_once SITEROOT . "/../config.php"; 

Вы должны использовать встроенные магические константы для поиска файлов. __FILE__ и __FILE__ . Если вы находитесь на PHP <5.3, вы должны использовать dirname(__FILE__)

Например

 require_once __DIR__.'/../../include_me.php'; 

$_SERVER['DOCUMENT_ROOT'] не всегда гарантированно возвращает то, что вы ожидаете.

Определите его в файле конфигурации где-нибудь.

Предполагая, что вы используете стиль MVC, где все маршрутизируется через один index.php, тогда

 realpath('.'); 

Покажет вам путь к текущему рабочему каталогу (т. Е. Где index.php)

Итак, вы можете определить это как

 define('PROJECT_ROOT', realpath('.')); 

Если это не MVC, и вам нужно, чтобы он работал с файлами в подпапках, вы можете просто скопировать его в файл конфигурации

 define('PROJECT_ROOT', 'C:/wamp/www/mysite'); 

Затем, когда вы включаете что-то, что можете сделать;

 include PROJECT_ROOT . '/path/to/include.php'; 

Вы можете альтернативно установить базовый каталог в файле .htaccess

 SetEnv BASE_PATH C:/wamp/www/mysite/ 

Затем в PHP вы можете ссылаться на него с помощью $_SERVER['BASE_PATH']

Попробуй это:

 $_SERVER['DOCUMENT_ROOT']