Php как узнать путь к файлу

Обновлено: 04.07.2024

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

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

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

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

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

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

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

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

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

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

Обратите внимание, что подключение файла config.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 – мы опустимся на два уровня ниже.

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

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

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

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

Заключение

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

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

11 декабря 2013 г., 11:23 Удалить комментарий

Константин Кирилюк

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

11 декабря 2013 г., 11:26 Удалить комментарий

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

11 декабря 2013 г., 12:35 Удалить комментарий

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

21 декабря 2015 г., 7:56 Удалить комментарий

Константин Кирилюк

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

Путь на сервере до файла через php, выведем на экран ! Вообще получим путь на сервере до файла разными способами!

Все о пути на сервере до файла на сайте

    -> теория -> без php -> глобальная переменная -> __FILE__ -> PHP_URL_PATH

Что такое путь до файла на сервере -> теория

Иногда, очень трудно понять, что означают те или иные значения! Как можно объяснить по простому, Что такое путь до файла на сервере!?

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

Выше есть еще несколько папок, с разной степенью доступа! И если мы весь путь, который существует выше корневой папки поставим вместо домена. то получим путь на сервере до файла home/domen/dwweb_ru/www /page/php/096_put_na_servere_do_fayla_php.html И если вы используете php, то вам все равно придется использовать путь на сервере до файла, потому, что многие функции работают только с файлом, к которому прописан путь на сервере

Получить путь до файла на сервере

Можно ли получить путь до файла на сервере без php!? Можно, но зачем!? Предположим, что у вас нет php!? Очень странно, но возможно! Никогда такой херней не занимался, но что не сделаешь для своих любимых пользователей.

У меня только единственный способ . кроме обращения в тех поддержку.

Заходим в админку, поскольку я не умею гадать, то заходим в свою админку сайта, у нас это DIRECTADMIN на ruweb - е

Ищем вкладку создать ftp аккаунт.

После того, как вы попали на новую вкладку опять нажимаем ftp аккаунт

Получить путь до файла на сервере

Получить путь до файла на сервере

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

Получить путь до файла на сервере

Получить путь до файла на сервере

Получить путь до файла на сервере -> способ №1

Да! Напоминаю, что в зависимости от структуры вашего сервера, и будет зависеть путь до файла на сервере

Для того, чтобы получить путь до файла на сервере нам понадобится, путь на сервере до корневой папки

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

Теперь соберем все вместе и выведем через echo

И получим путь на сервере до файла через глобальную переменную $_SERVER

home/domen/dwweb_ru/www/page/php/096_put_na_servere_do_fayla_php.html

Но у данной переменной есть некоторый минус, она вам покажет все, что есть после расширения, например get запрос.

Давайте сделаем живой пример и создадим ссылку с гет запросом нажмите по ссылке и посмотрите ниже пункта 4, что прибавилось в строке. выделено красным:

Как получить путь на сервере до файла с помощью -> __FILE__

Для того, чтобы получить путь на сервере до файла с помощью __FILE__, нам потребуется в самом файле установить код php!

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

Пример вывода пути до файла на сервере:

home/domen/dwweb_ru/www/page/php/096_put_na_servere_do_fayla_php.html

Путь на сервере до файла php с использованием PHP_URL_PATH

Когда вам нужно избавиться от всякого мусора в пути до файла на сервере, то можно использовать ниже идущий способ:

Если вы собирайтесь делать сайт, то вам все равно придется иметь на борту несколько путей и разных, в разных переменных!

Так не получится, что например вы написали одну переменную и этого вам хватит - точно вам говорю не хватит!

Вчера мы рассматривали путь до корневой папки .

Из которой вы узнали, что путь до корневой папки я помещал в переменную - $home

В переменную $parse_url поместим функцию parse_url и разберем на части $_SERVER['REQUEST_URI'] из которой получим только часть ссылки где есть путь:

Пути к файлам - тема, которая обычно взрывает мозг новичкам. Но не волнуйся, сейчас мы всё расставим по полочкам.

Чем отличаются пути в PHP и URL

Когда мы смотрим любимый фильм или сериал, мы видим только готовый продукт.

А за кадром существует совсем другой, невидимый для нас мир: стилисты и гримёры, искусственные декорации, наложение спецэффектов и многое другое.

В PHP существует такое же разделение. С одной стороны - реальная файловая система с реальными папками и файлами, с другой - URL адреса, которые могут не иметь ничего общего с реальной файловой структурой.

Если ты видишь на каком-нибудь сайте страницу с URL /category/monitors - это совсем не значит, что на сайте есть скрипт /category/monitors/index.php .

Вполне вероятно, что и такой папки там тоже нет, а все URL адреса обрабатываются одним единственным PHP файлом.

И даже если в URL присутствует расширение файла, например /about.html - это тоже не говорит о существовании файла about.html . Может он есть, а может и нет.

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

Ошибка №1: Подстановка физического пути в URL

Очень частая ошибка новичков - пытаться подставить в URL адрес ссылку на физический файл, вроде такого:

Это неправильно. Браузер не может видеть реальную файловую структуру сервера. Он не видит никаких дисков D, он видит только URL адреса.

Правильная ссылка выглядит так (разницу объясню чуть позже):

Ошибка №2: Подключение скриптов по URL

Иногда новички пытаются подключить физический файл по его URL:

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

Абсолютный путь в PHP

Абсолютный путь - это полный путь к папке или файлу. Вот пара примеров для разных операционных систем:

Как видите, это полный путь от корня диска до конкретного файла или папки. Начинается со слеша или буквы диска (Windows).

Получить абсолютный путь скрипта можно с помощью магической константы __FILE__ :

Для получения абсолютного пути к папке, в которой находится скрипт, есть магическая константа __DIR__ :

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

Если мы хотим подключить config.php по его абсолютному пути, есть два способа сделать это:

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

Относительный путь в PHP

У относительных путей в PHP есть один подвох - они могут строиться относительно не той папки, от которой мы ожидаем.

Сначала PHP попытается найти этот файл в папках, указанных в директиве include_path. Посмотреть, что указано в этой директиве конкретно у вас можно с помощью var_dump(get_include_path()); , папки разделяются символом ;

Далее PHP попытается найти файл в папке текущего рабочего каталога.

Например, если мы в index.php подключили файл scripts/script.php, а в этом самом script.php уже пытаемся подключить файл по относительному пути, тогда поиск файла произойдёт и в папке scripts тоже.

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

Именно по этой причине я призываю тебя отказаться от использования относительных путей в PHP.

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

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

Абсолютный путь в URL

Абсолютный путь в URL означает путь от корня сайта. Корень сайта - это папка, которая содержит публичную часть сайта, т.е. доступную извне.

Относительный путь в URL

Относительные пути в URL указываются без слеша в начале ссылки, например:

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

Чаще всего их использование приводит к путанице. И вот пара типичных проблем, с которыми часто сталкиваются новички.

Ошибка №1: относительные пути к стилям, скриптам и другим файлам

Представим, что мы решили подключить стили к нашему сайту:

Разработчик указывает относительный URL style.css и видит, что всё работает. По крайней мере, на главной странице.

Но при переходе по любой ссылке, например /products/15 , стили перестают работать.

А причина в том, что относительный путь строится от текущего URL-адреса, а значит в нашем примере он из style.css превратился в /products/15/style.css .

Ошибка №2: Рекурсия в ссылках

При использовании относительных путей есть риск случайно создать на сайте бесконечные ссылки. Вот один из таких способов:

Для работы данного кода должна быть настроена единая точка входа.

Текущий и родительский каталоги

Помимо указания конкретных папок, мы также можем добавить в путь указание "перейти на папку выше", например:

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

И с URL-адресами тоже:

Также мы можем указать ссылку на текущий каталог, что бывает актуально в некоторых операционных системах:

Сначала - выбор пути к файлу или каталогу, затем - чтение из каталога и/или чтение из файла.

Путь к файлу

Абсолютный путь - это полный путь к файлу от корневого каталога (папки) в файловой системе.

где userlogin - логин пользователя на сервере.

Слеш (/) обозначает корневой каталог.

Путь к каталогу, который является корневым для веб-сайта, задается в кофигурации сервера и содержится в системной php-переменной

В данном случае это ""/home/userlogin/public_html/mysite.ru"".

"/myplugin/file2.php" полный путь от корня сайта (адрес соответствующей веб-страницы - "http://site.ru//myplugin/file2.php")


Это значит, что в ссылках на локальные страницы сайта можно указывать только путь от корня сайта (без протокола и домена) "/myplugin/file2.php".
Относительный путь - это путь относительно документа, в котором используется ссылка на файл.

Например, пусть в папке сайта "myplugin" есть файл file2.php и папка "images", в которой находится файл "image1.jpg". Путь к файлу изображения из файла file2.php: "images/image1.jpg".

Чтобы подняться на директорию вверх, нужно написать"../".

Например, в файле file2.php можно указать на файл файл file1.php (в корневой папке сайта) как на файл в родительском каталоге "../file1.php" или в корневом каталоге "/file1.php".

"/tmp/file.html" полный путь от корня сайта (соответствующий веб-адрес "http://site.ru//tmp/file.html")
"tmp/data/" путь относительно текущего каталога ("tmp" - это подкаталог текущего каталога, а "data" - подкаталог каталога "tmp")
"./images/" подкаталог текущего каталога
"file.php" файл в текущем каталоге
"./file.php" файл в текущем каталоге
"../" родительский каталог
"../file.php" файл в родительском каталоге
"../../file.php" файл в каталоге, который на два уровня выше текущего каталога

Функции для работы с именами файлов и каталогов

bool file_exists(string $name) проверяет, существование файла или каталога с заданным именем
if ( !file_exists("file.txt") ) exit("Файл не существует");
string basename(string $path) возвращает имя файла из полного пути (т.е. имя файла без пути)
string dirname(string $path) возвращает имя каталога из полного пути; для текущего файла: dirname(__FILE__)
array pathinfo (string path [, int options]) возвращает ассоциативный массив, который содержит элементы пути path: dirname, basename и extension.
options позволяет задать, какие элементы будут возвращены: PATHINFO_DIRNAME, PATHINFO_BASENAME и PATHINFO_EXTENSION.
string realpath(string $path) преобразует относительный путь в абсолютный, например, в сценарии, расположенном в корневой папке:
echo realpath("file1.php"); // выведет /home/userlogin/public_html/mysite.ru/file1.php
string tempname(string $dir, string $prefix) генерирует (уникальное) имя временного файла
is_readable($path) проверяет возможность чтения файла или каталога***
bool is_dir(string $path) возвращает TRUE, если $path - это путь к существующему каталогу ***.
bool is_file ( string $path ) возвращает TRUE, если $path - это путь к существующему файлу (результат кэшируется***).
string getcwd (void) возвращает текущий каталог (например, "/home/userlogin/public_html/mysite.ru/myplugin")
int chdir( string $dir ) изменяет текущий каталог (переходит в заданный каталог)
boolean chroot (string $path) изменяет корневой каталог

*** Результаты функций, возвращающих информацио о состоянии файлов, кэшируются. Это функции stat(), lstat(), file_exists(), is_writable(), is_readable(), is_executable(), is_file(), is_dir(), is_link(), filectime(), fileatime(), filemtime(), fileinode(), filegroup(), fileowner(), filesize(), filetype() и fileperms().
Если во время выполнения php-скрипта состояние файла может изменяться, и это нужно проверять, следует очищать кэш. Это делает функция clearstatcache();

Чтение каталога

Если прочитать все элементы внутри каталога, в списке результатов окажутся элементы "." (текущий каталог) и ".." (родительский каталог) , что следует учитывать при обработке прочитанных элементов каталога.

resourse opendir (string $path) открывает каталог, например, текущий каталог можно открыть так:
opendir('.');
string readdir (resource $handle) Возвращает имя следующего по порядку элемента каталога, для которого создан дескриптор $handle (порядок следования элементов зависит от файловой системы).
void rewinddir (resource $handle) сбрасывает дескриптор каталога $handle (чтобы он указывал на начало каталога)
void closedir ($handle) закрывает каталог

Чтение каталога без создания дискриптора:

Все файлы с расширением ".txt" из папки "texts" в корневой папке сайта:

Продолжение - о чтении данных из файла - в следующей статье, которая называется
"Чтение файлов и каталогов в php-сценарии, продолжение: файлы".

Читайте также: