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

StackOverflow https://stackoverflow.com/questions/4369

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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]/"?

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

<?php

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

?>

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

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

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');

?>

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

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

require_once 'inc1.php';

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

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

например ,

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

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");

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

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

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

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

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

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

или что там еще.

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

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

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

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

Теперь эта глобальная переменная "ПУТЬ к ПРИЛОЖЕНИЮ" может использоваться для включения всех файлов вместо вызова realpath() каждый раз, когда вы включаете новый файл.

БЫВШИЙ:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top