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']