PHP, как найти корень приложения?
У меня проблемы с моими файлами include. Кажется, я не могу понять, как создавать URL-адреса, когда я использую require_once ('somefile.php'). Если я пытаюсь использовать файл include в более чем одном месте, где структуры каталогов различны, я получаю сообщение об ошибке, что файл include не может быть найден.
В asp.net, чтобы получить корневой путь моего приложения, я могу использовать ~/directory/file.aspx. Слабая косая черта всегда знает, что я ссылаюсь на корень моего сайта и нахожу файл независимо от того, где запрос поступает с моего сайта. Он всегда обращается к корню и ищет файл оттуда.
ВОПРОС: . Как я могу получить корневой путь моего сайта? Как я могу сделать это, чтобы я мог повторно использовать свои файлы include из любого места моего сайта? Должен ли я использовать абсолютные пути в моих URL-адресах?
Спасибо!
Ответы
Ответ 1
Существует $_SERVER['DOCUMENT_ROOT']
, который должен иметь корневой путь к вашему веб-серверу.
Изменить: если вы посмотрите на большинство основных php-программ. При использовании установщика вы обычно вводите полный путь к папке приложения. Установщик просто поместит это в файл конфигурации, который включен во все приложение. Один из вариантов - использовать auto preend file для установки переменной. другой вариант - просто include_once() конфигурационный файл на каждой странице, в которой вы нуждаетесь. Последний вариант, который я хотел бы предложить, - написать вам приложение, используя bootstrapping, в котором вы производите все запросы через один файл (обычно с url_rewrite). Это позволяет вам легко установить/включить конфигурационные переменные в одном месте и обеспечить их доступность во всех сценариях.
Ответ 2
Обычно я храню файл config.php
в каталоге ROOT, а в config.php
пишу:
define('ROOT_DIR', __DIR__);
А затем просто используйте константу ROOT_DIR во всех других сценариях.
Использование $_SERVER['DOCUMENT_ROOT']
не очень хорошо, потому что:
- Это не всегда соответствует ROOT_DIR
- Эта переменная недоступна в режиме CGI (например, если вы запускаете свои скрипты CRON)
Ответ 3
Приятно иметь один и тот же код в верхней части каждого script и знать, что ваша страница будет загружаться правильно, даже если вы находитесь в подкаталоге. Я использую это, полагаясь на то, что вы знаете, что называется корневой каталог (обычно это "htdocs" или "public_html":
defined('SITEROOT') or define('SITEROOT', substr($_SERVER['DOCUMENT_ROOT'], 0, strrpos($_SERVER['DOCUMENT_ROOT'], 'public_html')) . 'public_html');
Если SITEROOT определяется последовательно, вы можете получить доступ к файлам конфигурации и/или страницам без адаптации путей на основе script -by- script, например. в файл конфигурации, хранящийся вне вашей корневой папки:
require_once SITEROOT . "/../config.php";
Ответ 4
Вы должны использовать встроенные магические константы для поиска файлов. __FILE__
и __DIR__
. Если вы находитесь на PHP < 5.3 вы должны использовать dirname(__FILE__)
например.
require_once __DIR__.'/../../include_me.php';
$_SERVER['DOCUMENT_ROOT']
не всегда гарантированно возвращает то, что вы ожидаете.
Ответ 5
Определите его в файле конфигурации где-нибудь.
Предполагая, что вы используете стиль 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';
Ответ 6
Вы можете альтернативно установить базовый каталог в файле .htaccess
SetEnv BASE_PATH C:/wamp/www/mysite/
Затем в PHP вы можете ссылаться на него с помощью $_SERVER['BASE_PATH']
Ответ 7
Попробуйте следующее:
$_SERVER['DOCUMENT_ROOT']