Как установить абсолютный путь включения в PHP?

В HTML я могу найти файл, начинающийся с корневой папки веб-сервера, начав путь к файлу с «/». Нравиться:

/images/some_image.jpg

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

С PHP я пробовал нечто подобное:

include("/includes/header.php");

... но это не работает.

Я думаю, что эта страница говорит, что я могу установить include_path один раз, и после этого это будет принято. Но я не совсем понимаю синтаксис. Оба примера начинаются с точки и говорят:

Using a . in the include path allows for relative includes as it means the current directory.

Относительные включения - это именно то, что мне нужно не.

Как мне убедиться, что все мои включения указывают на папку root/includes? (Бонус: что, если я захочу поместить эту папку вне общедоступного каталога?)

Разъяснение

Мои файлы разработки в настоящее время обслуживаются XAMPP / Apache. Это влияет на абсолютный путь? (Я еще не уверен, какой будет производственный сервер.)

Обновлять

Я не знаю, в чем была моя проблема. include_path, о котором я упоминал выше, был именно тем, что я искал, и синтаксис на самом деле не сбивает. Я просто попробовал, и он отлично работает.

Мне приходит в голову одна вещь: некоторые люди могли подумать, что «/ some / path» был «абсолютным путем», потому что они предполагали, что ОС - это Linux. Это сервер Windows, поэтому абсолютный путь должен начинаться с имени диска.

В любом случае проблема решена! :)

Пожалуйста, объясните, что означает «... но это не работает».

Milen A. Radev 05.12.2008 20:59

Я начинаю думать, что не понимаю, что вы подразумеваете под абсолютным путем.

Jacco 06.12.2008 20:18

Jacco: под абсолютным путем я подразумеваю «путь, начинающийся от корня веб-сервера, а не от того места, где используется код». Также НЕ "запуск с жесткого диска". Я хочу иметь возможность без изменений переместить код на другой сервер.

Nathan Long 08.12.2008 22:13

Большинство людей назвали бы это «корнем документа». Имейте в виду, что $ _SERVER ['DOCUMENT_ROOT'] не всегда доступен.

Jacco 13.12.2008 03:11

@Jacco - когда $ _SERVER ['DOCUMENT_ROOT'] будет недоступен?

Nathan Long 25.07.2009 22:00

@NathanLong Примером может служить вызов файла php из командной строки, в этом случае массив $_SERVER будет пустым

gilbertbw 12.08.2015 15:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
41
6
104 606
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Ответ принят как подходящий

Что я делаю, так это помещаю файл config.php в свой корневой каталог. Этот файл включен во все файлы PHP в моем проекте. Затем в этом файле config.php я делаю следующее:

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

Тогда во всех файлах я знаю, что такое корень моего проекта, и могу делать такие вещи, как это

require_once( ROOT_DIR.'/include/functions.php' );

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

Вот как я почти всегда это вижу. По крайней мере, для основных включений.

Ballsacian1 14.04.2010 20:53

Но как вы выполняете первоначальное включение config.php? Вы просто знаете, где это?

Snowburnt 26.09.2013 15:02

Да, как я сказал в конце своего сообщения, у него есть недостаток, заключающийся в необходимости использовать относительный путь ('../../config.php') для его поиска, что затрудняет рефакторинг вашего кода или перемещение файлов. . Это означает, что вам нужно поддерживать только одно из своих включений, чтобы упростить задачу.

Rob Prouse 27.09.2013 20:54

Простая альтернатива dirname(__FILE__) - __DIR__.

Kush 03.01.2019 11:49

Параметр include_path работает как $ PATH в unix (аналогичный параметр есть и в Windows). Он содержит несколько имен каталогов, разделенных двоеточиями (:). Когда вы включаете или запрашиваете файл, поиск в этих каталогах выполняется по порядку, пока не будет найдено совпадение или пока не будет выполнен поиск во всех каталогах.

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

ini_set("include_path", "/your_include_path:".ini_get("include_path"));

Таким образом, сначала выполняется поиск в вашем подключаемом каталоге, а затем по исходному пути поиска (по умолчанию текущий каталог, а затем PEAR). Если у вас нет проблем с изменением include_path, то это решение для вас.

Да! Я только что обнаружил это и пришел сюда, чтобы опубликовать это, а потом заметил ваш ответ. Извини, я позволил этому так долго томиться. :) Документация: php.net/manual/en/ini.core.php#ini.include-path

Nathan Long 14.04.2010 20:50

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

Nathan Long 22.04.2010 01:50

Не отвечу прямо на ваш вопрос, но кое-что нужно запомнить:

When using includes with allow_url_include on in your ini beware that, when accessing sessions from included files, if from a script you include one file using an absolute file reference and then include a second file from on your local server using a url file reference that they have different variable scope and the same session will not be seen from both included files. The original session won't be seen from the url included file.

от: http://us2.php.net/manual/en/function.include.php#84052

В включают / требовать нет ничего, что запрещало бы вам использовать абсолютный путь. так что твой пример

include('/includes/header.php'); 

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

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

Эта директива настраивает, где вы можете включать / требовать свои файлы, и это может быть вашей проблемой. Некоторые панели управления (например, plesk) по умолчанию устанавливают эту директиву такой же, как корень документа.

что касается синтаксиса '.':

/home/username/public_html <- absolute path  
public_html <- relative path  
./public_html <- same as the path above  
../username/public_html <- another relative path  

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

require_once(__DIR__ . '/Factories/ViewFactory.php');

В этом выпуске вы указываете абсолютный путь относительно файла, содержащего инструкцию require_once().

Привет всем ... у меня была аналогичная проблема с моей системой cms. Мне нужен был трудный путь для некоторых аспектов безопасности. Думаю, лучший способ - это как написал Роб. для быстрого грязного кодирования думаю, это тоже работает .. :-)

<?php
$path   = getcwd(); 
$myfile = "/test.inc.php";

/* 

getcwd () указывает на: / usr / srv / apache / htdocs / myworkingdir (в качестве примера)

echo ($path.$myfile);
would return...

/usr/srv/apache/htdocs/myworkingdir/test.inc.php

access outside your working directory is not allowed.
*/


includ_once ($path.$myfile);

//some code

?>

приятный день strtok

доступ за пределами вашего рабочего каталога разрешен без ограничений open_basedir

Jacco 05.12.2008 20:43

да, но скажите это моему провайдеру :)) я боролся с ним за отключение safe_mode ... после нескольких недель обсуждений .. он сделал это ..

strtok 05.12.2008 20:49

Одна стратегия

Не знаю, лучший ли это способ, но у меня он сработал.

$root = $_SERVER['DOCUMENT_ROOT'];
include($root."/path/to/file.php");

ты великолепен!! Я пробовал очень много других вещей, и это отлично сработало. Спасибо:)

luv2code 15.02.2013 11:56

Это решение, которое я использовал, и оно отлично сработало! Престижность

Alen Saqe 04.07.2014 18:03

В этом я следую примеру Wordpress. Я иду и определяю корневой путь, обычно это корень документа, а затем определяю кучу других путей вместе с ним (по одному для каждого из моих каталогов классов. IE: база данных, пользователи, html и т. д.). Часто я определяю корневой путь вручную, вместо того, чтобы полагаться на переменную сервера.

Пример


if ($_SERVER['SERVERNAME'] == "localhost")
{
    define("ABS_PATH", "/path/to/upper/most/directory"); // Manual
}
else
{
    define("ABS_PATH, dirname(__FILE__));
    // This defines the path as the directory of the containing file, normally a config.php
}

// define other paths...

include(ABS_PATH."/mystuff.php");

Черт возьми, я не понимал, сколько лет этому вопросу.

Tyler Carter 25.07.2009 19:51

Спасибо - это одна из 2 ссылок, которые появляются, если вы используете Google для абсолютного пути php apache windows.

Как новичок в PHP-разработчике, я не понимал, почему абсолютные пути в системах apache windopws будут c: \ xampp \ htdocs (корень документа apache - по умолчанию XAMPP) вместо /

таким образом, если в http // localhost / myapp / subfolder1 / subfolder2 / myfile.php я хотел бы включить файл из http // localhost / myapp

Мне нужно было бы указать это как: include ("c: \ xampp \ htdocs \ myapp \ includeme.php") или же include ("../../ includeme.php")

И НЕТ включить ("/ myapp / includeme.php")

Я придумал одну строку кода, которую нужно установить поверх каждого моего php-скрипта, чтобы компенсировать:

<?php if (!$root) for($i=count(explode("/",$_SERVER["PHP_SELF"]));$i>2;$i--) $root .= "../"; ?>

Благодаря этому построению $ root to bee "../" поднимается вверх по иерархии от того места, где размещен файл. Всякий раз, когда я хочу включить абсолютный путь, строка будет такой:

<?php include($root."some/include/directory/file.php"); ?>

Мне это не очень нравится, кажется неудобным способом решить эту проблему, но, похоже, он работает независимо от того, на какой системе работает php и где бы ни был размещен файл, что делает его независимым от системы. Чтобы получить доступ к файлам за пределами веб-каталога, добавьте еще несколько ../ после $root, например $root."../external/file.txt".

Другой вариант - создать файл в каталоге $_SERVER['DOCUMENT_ROOT'] с определением вашего абсолютного пути.

Например, если ваш каталог $_SERVER['DOCUMENT_ROOT']

C:\wamp\www\

создать файл (например, my_paths.php), содержащий это

<?php if (!defined('MY_ABS_PATH')) define('MY_ABS_PATH',$_SERVER['DOCUMENT_ROOT'].'MyProyect/')

Теперь вам нужно только включить в каждый файл в папке MyProyect этот файл (my_paths.php), чтобы вы могли использовать MY_ABS_PATH в качестве абсолютного пути для MyProject.

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