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

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

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

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

спасибо!

7 ответов


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

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


Я обычно в магазине на корневого каталога и config.php Я пишу:

define('ROOT_DIR', __DIR__);

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

  • это не всегда совпадающие ROOT_DIR
  • эта переменная недоступна в CGI режим (e.X. если вы запускаете свои скрипты по CRON)

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

Э. Г.

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

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


приятно иметь возможность использовать один и тот же код в верхней части каждого скрипта и знать, что ваша страница будет загружаться правильно, даже если вы находитесь в подкаталоге. Я использую это, что зависит от того, что вы знаете, как называется ваш корневой каталог (обычно "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";

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

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

realpath('.');

покажет вам путь к текущему рабочему каталогу (i.E где индекс.php есть)

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

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

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

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

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

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

вы можете поочередно установить базовый каталог в своем

SetEnv BASE_PATH C:/wamp/www/mysite/

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


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

$_SERVER['DOCUMENT_ROOT']