Как включить PHP-файлы, для которых требуется абсолютный путь?


У меня есть структура каталогов, подобная следующей;

Script.php

Inc/include1.php
inc/include2.php

Objects/object1.php
objects/object2.php

Soap/soap.php

Теперь я использую эти объекты как в script.php, так и в /soap/soap.php, я мог бы переместить их, но мне нужна такая структура каталогов по определенной причине. При выполнении script.php путь включения равен inc/include.php, а при выполнении /soap/soap.php - ../inc, абсолютный пути работают, /mnt/webdev/[project name]/inc/include1.php... Но это уродливое решение, если я когда-нибудь захочу переместить каталог в другое место.

Итак, есть ли способ использовать относительные пути или способ программно генерировать "/mnt/webdev/[project name]/"?

 85
php
Author: Jasper, 2008-08-07

11 answers

Это должно сработать

$root = realpath($_SERVER["DOCUMENT_ROOT"]);

include "$root/inc/include1.php";

Редактировать: добавлено улучшение австралийский туризм

 140
Author: Peter Coulton, 2017-05-23 11:47:20

Вы можете использовать относительные пути. Попробуйте __FILE__. Это константа PHP, которая всегда возвращает путь/имя файла скрипта, в котором она находится. Итак, в soap.php вы могли бы сделать:

include dirname(__FILE__).'/../inc/include.php';

Полный путь и имя файла. Если используется внутри включения, возвращается имя включенного файла. Начиная с PHP 4.0.2, __FILE__ всегда содержит абсолютный путь с разрешенными символическими ссылками, тогда как в более старых версиях при некоторых обстоятельствах он содержал относительный путь. (источник)

Другим решением было бы установить путь включения в файле httpd.conf или .htaccess.

 42
Author: Kevin, 2017-09-09 01:01:54

Взгляните на http://au.php.net/reserved.variables

Я думаю, что переменная, которую вы ищете, это: $_SERVER["DOCUMENT_ROOT"]

 7
Author: Christian Hagelid, 2011-07-12 23:50:49

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

 6
Author: Ryan Fox, 2008-08-07 04:04:55

Другой способ справиться с этим, который вообще устраняет необходимость в включениях, - это использовать функцию автоматической загрузки . Включение всего, что нужно вашему сценарию "На всякий случай", может снизить производительность. Если вы включаете все определения классов или интерфейсов и хотите загружать их только при необходимости, вы можете перегрузить функцию __autoload() своим собственным кодом, чтобы найти соответствующий файл класса и загрузить его только при вызове. Вот пример из руководства:

function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 

До тех пор, пока ты установите переменные include_path соответствующим образом, вам больше не нужно будет включать файл класса.

 4
Author: Sam McAfee, 2008-09-18 14:28:50

Другой вариант, связанный с Кевином, - использовать __FILE__, но вместо этого замените имя файла php внутри него:

<?php

$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
require_once($docRoot . '/lib/include.php');

?>

Я использую это уже некоторое время. Единственная проблема заключается в том, что иногда у вас нет $_SERVER['SCRIPT_NAME'], но иногда есть другая похожая переменная.

 2
Author: Darryl Hein, 2013-11-27 18:23:02

Я обнаружил, что это работает очень хорошо!

function findRoot() { 
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

Использование:

<?php

function findRoot() {
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

include(findRoot() . 'Post.php');
$posts = getPosts(findRoot() . 'posts_content');

include(findRoot() . 'includes/head.php');

for ($i=(sizeof($posts)-1); 0 <= $i; $i--) {
    $posts[$i]->displayArticle();
}

include(findRoot() . 'includes/footer.php');

?>
 2
Author: Thane Gill, 2017-03-04 10:24:34

Я думаю, что лучший способ - поместить ваши включения в ваш путь включения PHP. Существуют различные способы сделать это в зависимости от ваших настроек.

Затем вы можете просто обратиться к

require_once 'inc1.php';

Из любого файла, независимо от того, где он находится, в ваших файлах, доступных в Интернете, или в любом уровне вложенных подкаталогов.

Это позволяет вам размещать включаемые файлы за пределами корневого каталога веб-сервера, что является наилучшей практикой.

Например,

site directory
    html (web root)
        your web-accessible files
    includes
        your include files

Также, проверьте __автозапуск для отложенной загрузки файлов классов

Http://www.google.com/search?q= настройка+php+включить+путь

Http://www.google.com/search?q=__autoload

 1
Author: Polsonby, 2008-08-07 19:23:14
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");

Я использую эту строку кода. Он возвращается к "вершине" дерева сайта, затем переходит к нужному файлу.

Например, допустим, у меня есть это файловое дерево:

Domain.com/aaa/index.php
domain.com/bbb/ccc/ddd/index.php
domain.com/_resources/functions.php

Я могу включить functions.php файл из любого места, где я нахожусь, просто скопировав вставку

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");

Если вам нужно использовать этот код много раз, вы можете создать функцию это возвращает часть str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1)). Затем просто вставьте эту функцию в первый включенный файл. У меня есть"initialize.php "файл, который я включаю в самую верхнюю часть каждой страницы php и который содержит эту функцию. В следующий раз, когда мне нужно будет включить файлы, я на самом деле просто использую функцию (с именем path_back):

require(path_back()."/_resources/another_php_file.php");
 1
Author: Machavity, 2015-04-13 14:37:07

@Flubba, позволяет ли это мне иметь папки внутри моего каталога include? каталоги с плоским включением вызывают у меня кошмары. поскольку весь каталог объектов должен находиться в каталоге inc.

О да, безусловно. Так, например, мы используем один слой вложенных папок, как правило:

require_once('library/string.class.php')

Вам нужно быть осторожным, слишком полагаясь на путь включения на сайтах с действительно высоким трафиком, потому что php должен искать в текущем каталоге, а затем все каталоги на пути включения, чтобы узнать, есть ли ваш файл, и это может замедлить работу, если вы забьетесь.

Так, например, если вы делаете MVC, вы бы указали путь к своему приложению напрямую в поле включить путь, а затем указали ссылку на вещи в форме

'model/user.class'
'controllers/front.php'

Или что-то еще.

Но, вообще говоря, это просто позволяет вам работать с действительно короткими путями в вашем PHP, которые будут работать из любого места, и их намного легче читать, чем все это корневая ошибка документа realpath.

Преимущество тех альтернатив на основе сценариев, которые предлагали другие, заключается в том, что они работают где угодно, даже в общих ящиках; установка пути включения требует немного больше размышлений и усилий, но, как я уже упоминал, позволяет вам начать использовать __автозапуск, который просто самый крутой.

 0
Author: Polsonby, 2008-08-08 23:17:12

Если вы собираетесь указать определенный путь в большинстве файлов вашего приложения, создайте глобальную переменную в корневой папке.

define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or 
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));

Теперь эта глобальная переменная "APPLICATION_PATH" может использоваться для включения всех файлов вместо вызова realpath() каждый раз, когда вы включаете новый файл.

ПРИМЕР:

include(APPLICATION_PATH ."/config/config.ini";

Надеюсь, это поможет;-)

 0
Author: yuvraj, 2018-05-09 10:10:21