Абсолютный и относительный путь к файлу

Любая web-страница, картинка, видео и т. д. это в первую очередь файл, имеющий свой абсолютный или относительный путь (адрес). Сам файл в сети Интернет находится на компьютере, который называется сервер. Таким образом, следует учесть способы представления файла на сервере и в сети Интернет. В данной статье мне бы хотелось прояснить перечисленные моменты и внести ясность в затронутый вопрос. Попробуем?

Абсолютный путь (адрес)

Что такое абсолютный путь к файлу?

Абсолютный путь или адрес – это полный путь или адрес, относительно домашней папки на сервере или доменного имени в сети Интернет.

Говоря «домашняя папка» я подразумеваю начало выделенного хостинг-провайдером пространства. Например, если речь идёт о локальном сервере, на операционной системе Windows, в качестве домашней папки будет выступать сам диск, т. е. C:/. В тоже время, зачастую хостинг-провайдер выделяет пользователю лишь определенное виртуальное (условное) пространство, для которого в качестве домашней папки выступает определенная папка, зачастую называемая /home.

Говоря «доменное имя» я подразумеваю URL-адрес, который начинается с упоминания протокола, например: http://sitename.ru/. В сети Интернет, именно он является домашней папкой для каждого из представленных ресурсов.

Как узнать абсолютный путь на сервере в PHP?

Если с URL-адресом всё более-менее понятно, то вот с домашней папкой на сервере дело обстоит несколько сложнее. В конце концов, у каждого провайдера есть свои заморочки и это следует учесть.

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

Уточню, говоря «корневая папка» я подразумеваю папку на сервере, выделенную для сайта. Именно она служит отправной точкой URL-адреса относительно доменного имени.

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

$abspath = dirname(__FILE__) .'/';

В PHP 5.3 и новее, можно уже использовать константу __DIR__:

$abspath = __DIR__

Таким образом очень удобно подключать в дальнейшем файл config.php и использовать полученный в нем абсолютный путь переменной $abspath как отправную точку. Например, предположим, что скрипт test.php находится в папке: path/ – а нужный файл data.txt в папке: data/. В этом случае вызов может иметь вид:

include_once('../config.php');
$fh = fopen($abspath .'data/data.txt', 'r');

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

Относительный путь (адрес)

Что такое относительный путь к файлу?

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

Любая файловая система представляет собой строгую иерархию родительских и дочерних папок и файлов. Например: C:\folder\file.php – здесь папка folder\ является дочерней для диска C:\ и родительской для файла file.php.

Для наглядности давайте рассмотрим следующую иерархию:

  • C:\
  • file1.php
  • folder\
    • file.php
    • subfolder\
      • file3.php

Чтобы из файла C:\folder\file.php обратиться к файлу C:\file2.php, нам нужно выйти из текущей папки folder\, т.е. подняться на один уровень выше. Для этого можно использовать, папку (я бы даже сказал псевдо-папку) родительского каталога, представляющую собой две точки (..). Другими словами, мы получим путь: ..\file2.php – относительно файла file.php.

Чтобы из файла C:\folder\file.php обратиться с файлу C:\folder\subfolder\file3.php, нам нужно войти в подпапку subfolder\, т.е. опуститься на один уровень ниже. Так мы получим путь: subfolder\file3.php – относительно файла file.php.

Давайте усложним задачу и обратимся из файла C:\folder\subfolder\file3.php к файлу C:\file2.php. Относительный путь будет иметь вид: ..\..\file2.php – мы поднялись на два уровня выше. Выполнить обратное, т.е из файла C:\file2.php обратимся к файлу C:\folder\subfolder\file3.php. Относительный путь будет иметь вид: folder\subfolder\file3.php – мы опустимся на два уровня ниже.

Преимущества и недостатки относительного пути (адреса)

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

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

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

Заключение

В своей статье я постарался рассмотреть фундаментальный вопрос, связанный с абсолютными и относительными путями (адресами) к файлам и папкам. По сути, если вы работаете на компьютере, то уже априори имеете представление о файловой системе, но без учета некоторых нюансов, достаточно сложно сдвинуться с мертвой точки и затронуть ряд вопрос, которые неизбежно относятся к правильности адресации. На этом у меня всё. Спасибо за внимание. Удачи!

Короткая ссылка: http://goo.gl/FGJNm5

Nina
Nina комментирует...

Я прочла ДВА раза, но не поняла ничего! Хотя наверное нужно. Есть проблемы со входом без видимых причин.

Константин Кирилюк
Константин Кирилюк комментирует...

@Nina попробуйте прочитать только определения, я человек увлекающийся, а моё увлечение не всякий осилить может :-)

kiovo
kiovo комментирует...

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

Анонимный
Анонимный комментирует...

Добрый день.

Можете уточнить, вот , например в резу-те выполнения кода dirname(__FILE__) получим такой путь C:\folder а вы к нему добавляете что-то вроде /data/data.txt, получится C:\folder/data/data.txt. Т.е. сначала обратная косая черта, потом обычная, это все нормально воспринимается сервером и браузером, я имею в виду полученная строка

Константин Кирилюк
Константин Кирилюк комментирует...

2Анонимный Такой вариант получается в том случае, когда речь идёт о Windows. И да, такой путь воспринимается сервером нормально. Браузер же получает уже HTML, где такой путь не используется.