Как мне отформатировать PHP include () абсолютный (а не относительный) путь? - PullRequest
22 голосов
/ 05 декабря 2008

На разных страницах моего PHP-сайта и в разных вложенных каталогах я хочу включить определенный файл по пути относительно корня.

Какую единственную команду я могу поставить на обе эти страницы ...

http://www.example.com/pageone.php
http://www.example.com/somedirectory/pagetwo.php

... включить эту страницу:

http://www.example.com/includes/analytics.php

Это не работает:

<?php include('/includes/analytics.php'); ?>

Имеет ли значение, что это размещено в IIS на Windows?

Ответы [ 9 ]

24 голосов
/ 05 декабря 2008

Вы можете просто использовать include $_SERVER['DOCUMENT_ROOT'] . "/includes/analytics.php";

9 голосов
/ 05 декабря 2008

С точки зрения PHP root - это верх файловой системы на веб-сервере, а не root с точки зрения веб-браузера.

Большинство людей делают одно из следующих действий.

Определите константу в глобальном файле конфигурации и используйте ее в каждом вызове для запроса / включения.

Или они используют такой код.

require_once realpath(dirname(__FILE__).'/config.php');
require_once realpath(dirname(__FILE__).'/lib/Database.php');

Использование переменных среды может быть опасным в некоторых случаях и быть источником проблем безопасности.

8 голосов
/ 05 декабря 2008

Как говорит @Stefan Mai, PHP не имеет «корневого» пути, но вы можете определить его довольно легко - большинство сайтов имеют страницу, которая каждый раз включается (например, файл конфигурации), к которой вы можете добавить:

define('ROOT', dirname(__FILE__));

Тогда используйте include ROOT. «/includes/analytics.php';

Что-то, что также весьма полезно, - это директива auto_prepend, которую вы можете использовать в .htaccess на apache - не уверен насчет ее настройки на IIS (хотя вы можете иметь глобальную в PHP ini).

5 голосов
/ 05 декабря 2008

Если вы дадите include () или require () (или версии * _once) абсолютный путь, этот файл будет включен. Абсолютный путь начинается с «/» в unix и с буквы диска и двоеточия в Windows.

Если вы укажете относительный путь (любой другой путь), PHP будет искать каталоги по значению конфигурации «include_path» по порядку, пока не будет найдено совпадение или не останется больше каталогов для поиска.

Итак, вкратце, чтобы включить абсолютное имя файла, укажите абсолютное имя файла. Смотрите также функцию realpath () .

Если вы хотите установить свой собственный включаемый «root», взгляните на этот вопрос (конкретно мой ответ, конечно: -)

4 голосов
/ 13 декабря 2010

Я объединил вышеупомянутые предложения и придумал это.

В моем config.php файле я определяю ROOT как:

define('ROOT', $_SERVER['DOCUMENT_ROOT']);

Затем я использую его в своих последующих файлах:

include_once(ROOT."/someFile.php");

include_once(ROOT."/includes/someFile.php");

1 голос
/ 05 декабря 2008

Это работает.

<?php include('c:/inetpub/example.com/includes/analytics.php'); ?>

Мне нужно сделать часть c:/inetpub/example.com/ некоторой глобальной переменной, чтобы она была несколько переносимой с сервера на сервер.

1 голос
/ 05 декабря 2008

Используйте .., чтобы перейти в каталог. Так в pageone.php

include 'includes/analytics.php';

в pagetwo.php

include '../includes/analytics.php';

Насколько я знаю, в PHP нет понятия "root", хотя вы можете определить его, если хотите. Желаем удачи!

0 голосов
/ 10 сентября 2013

Я нашел способ:

<?php include $_SERVER['DOCUMENT_ROOT'].'\\Your\\Site\\Path.php' ?>

Символ \\ необходим, если у вас есть какой-то специальный символ, который можно экранировать (например, \ n), чтобы \\ было \ в строке.

Поскольку вы находитесь в Windows, вы должны использовать \ вместо /

0 голосов
/ 05 декабря 2008

Тильда интерпретируется оболочкой как специальный символ, поэтому ее использование внутри кода PHP не будет работать независимо от ОС.

Если вы пытаетесь получить доступ к чему-то, относящемуся к домашнему каталогу пользователя, вы можете попробовать getenv() - я уверен, что Windows устанавливает переменную среды, эквивалентную $HOME.

...