PHP как найти рут приложения? - PullRequest
25 голосов
/ 17 октября 2010

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

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

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

Спасибо!

Ответы [ 7 ]

21 голосов
/ 17 октября 2010

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

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

10 голосов
/ 18 октября 2010

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

define('ROOT_DIR', __DIR__);

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

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

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

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

SetEnv BASE_PATH C:/wamp/www/mysite/

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

0 голосов
/ 17 октября 2010

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

Предполагается, что вы используете стиль 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';
0 голосов
/ 17 октября 2010

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

Например,

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

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

0 голосов
/ 17 октября 2010

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

$_SERVER['DOCUMENT_ROOT']
...