Relative and absolute paths, in the file system and on the web server

Relative and absolute paths, in the file system and on the web server Техника

When working with PHP, it’s often necessary to get the absolute path of a file or directory on the server. This is because some functions and scripts require the absolute path to work properly. In this article, we’ll explain what absolute paths are, why they are important, and show you several examples of how to get the absolute path in PHP.

Вы здесь:
Главная — PHP — PHP Скрипты — Определение директорий в PHP

Relative and absolute paths, in the file system and on the web server

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

Как получить корневую директорию сайта?

А вот пример получения директории из которой был вызван файл:

Магическая константа FILE содержит абсолютный путь к файлу. dirname — возвращает родительскую директорию файла.

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

Вот так, с помощью простых операции можно получить требуемую информацию.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

The document root, also known as the web root, is the topmost directory in your web server’s file structure where your website’s files and folders are stored. It is a crucial aspect of web development, as it serves as the starting point for your website. In this article, we will explore how to find the document root using PHP scripts, which will help you manage your website more effectively and enhance your web development skills.

Understanding the $_SERVER Variable

Relative and absolute paths, in the file system and on the web server

Getting the Document Root using PHP

The output may differ depending on your server’s configuration and operating system. The displayed path is the location where your website’s files and folders are stored on the server.

Using the Document Root in Your PHP Scripts

Once you know your document root, you can use it in your PHP scripts to access files or directories relative to the document root. This helps ensure that your file paths are consistent and accurate, regardless of where your script is located within your website’s file structure.

By using the document root variable in your PHP scripts, you can ensure that your file paths are accurate and reliable, regardless of the script’s location within your website’s structure.

Conclusion

Вы здесь:
Главная — PHP — PHP Основы — Работа с файлами в PHP

Relative and absolute paths, in the file system and on the web server

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

Последовательность работы с файлами в PHP такая:

Как видите, последовательность работы с файлами напоминает работу с файлами через обычный проводник. Только здесь вся работа выполняется автоматически самим PHP-скриптом.

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

Также различают два режима работы с файлами: бинарный (обозначается b) и текстовый (обозначается t). Если Вы работаете с обычным текстовым файлом, то выбирайте текстовый режим, а если, например, с изображением, то бинарный.

Это все основные модификаторы, которых Вам вполне хватит. Теперь давайте узнаем, как закрыть файл. Закрывается файл с помощью функции fclose().

Теперь перейдём к чтению файла с помощью функции fread(). И давайте, наконец-то, приведу пример:

В данном примере мы сначала открываем файл для чтения в текстовом режиме (модификатор rt). Функция fopen() возвращает так называемый дескриптор, с помощью которого можно общаться с файлом, и записываем его в переменную handle. Затем мы в цикле while() до тех пор, пока не достигнут конец файл, считываем содержимое каждый раз по 4096 символов, которые записываем в переменную contents. После завершения процесса считывания — закрываем файл, вновь с помощью дескриптора файла.

Теперь перейдём к записи с помощью функции fwrite():

После запуска этого скрипта, в файле a.txt добавится строка «This is text».

Особо внимательные читатели обратили внимание на указатели, о которых я писал чуть выше. Указатель — это текущая позиция воображаемого «курсора» в файле. Именно с него и начинается работа с файлом. Изменить положение указателя можно с помощью функции fseek():

Таким образом, мы сначала считываем 3 символа (в результате, текущее положение указателя сдвигается на 3 позиции). Затем мы устанавливаем указатель на начало файла. И вновь считываем 3 символа. Как Вы и догадались, мы два раза считали одно и тоже. То есть первый раз 3 символа, потом вернулись назад, и вновь считали 3 символа. Также если у функции fseek() заменить SEEK_SET на SEEK_CUR, то тогда второй параметр будет не устанавливать позицию указателя, а сдвигать относительно текущего местоположения. Советую даже попрактиковаться с указателями, потому что для понимания это не так просто. Также рекомендую попытаться записать что-нибудь в файл при позиции указателя, например, в самом начале файла. И обязательно объясните полученный результат.

Дополнительно:  Синий экран или BSOD: Дневник группы «Компьютерная помощь :)»: Группы - женская социальная сеть

И, напоследок, хочется привести ещё пару функций, которые позволяют работать с файлами на самом простом уровне: file_put_contens() и file_get_contents(). Функция file_put_contents() записывает в файл, а функция file_get_contents() считывает содержимое из файла. Эти функции очень просты в применении, но возможностей там уже меньше (хотя, как правило, они и не нужны):

В данном скрипте мы сначала записали строку «This is text 2» в файл, а потом считываем полученное содержимое и выводим его. Как видите, трудно придумать более простой способ чтения из файла и запись в файл.

Вот и все основные моменты работы с файлами в PHP.

Спасибо за внимание!

Intro

Your site exists in two realms at once: the real and the virtual one.

For the site visitors it’s entirely a virtual server, which in many ways is different from a real one. There are no files for starter. I know, it’s hard to believe at first, but it’s a fact. In the address like http://example.com/file.html, file.html is not a file. It’s a part of URI, a virtual resource. There could be or could be not a real file with such a name, but it doesn’t matter. Your browser cannot know that, and don’t need to. All it needs to know is an address.

For the site developer, on the other hand, their site is a certain program running on a particular server, on the very real computer with HDD, files and directories. And your PHP script, while reading data files or including other scripts, is working with such real files that exist on the physical medium.

So this dualism is the root of many problems.

However, to sort these things out all you need is to grasp just two simple concepts:

The difference between absolute and relative paths

It’s fairly simple.

So it goes for the paths in the computer world: given the absolute address, you can always get to the place, no matter from where you started. Whereas relative path is tricky, and should be used with caution, only when you positively know where you are at the moment.

Absolute paths

So again: an absolute path is one starting from the system root

Some absolute path examples:

Note that in Unix-like systems (and web-servers) the root is defined as a slash — /. And this is very important to know. It is not just a marker, but already a full qualified address, a path. Type cd / in your unix console and you will get to the root directory. Exactly the same is true for all web servers. So you can tell that in the http://example.com/ address the trailing slash is not for the decoration but a regular address itself — the address of the home page.

On Windows, the filesystem doesn’t have the common root for the whole system but split between disks, so an absolute paths starts from the drive letter. Whereas each disk has its own root, which is a backslash — . So you can type cd and get to the root of the current disk.

So you can tell that windows is rather confusing, but for the simplicity we would pretend that we have only one disk, and within its boundaries the rules are pretty much the same as in Unix.

So now you can tell an absolute path from a relative one — it is starting from the root, which is:

If you don’t supply the root, it means that your path is relative.

The simplest example of relative path is just a file name, like index.html. So one should be careful with relative paths. If your current directory is /about/ then index.html would be one, but if you switch it to /contacts/ then it will be another.

Other relative path examples:

What you ought to know is that the system, when encountered a relative path, always builds it up to the absolute one. Both web-server and file system are doing that but different ways. So, let’s learn them.

This is the most interesting part. There is a point where the real world meets the virtual one.

Imagine there is a file like /var/www/site/forum/index.php.
While on the web-server its address is http://www.site.ru/forum/index.php

And here the point can be clearly seen: there is a part, common for both addresses: /forum/index.php, which is the very source of confusion.

For the browser, this path is perfectly absolute, starting from the root of the web-server.
Whereas for the script it’s only a part of the full path — the filesystem path. And if you try to use it in PHP it will result in a failure: there is no /forum/ catalog on the HDD!

So now you can tell that to make any file system path work, it should be absolute and built using DOCUMENT_ROOT. So a correct PHP code to access /forum/index.php from PHP would be

here we are using web-server part of the path, prepending it with the document root. Voila!

Web server paths

are much simpler.

Therefore, to make an HTML link absolute, just build it from the site root — and you will never see a 404 error for the existing file again!

Дополнительно:  Running app inside Docker as non-root user

Imagine your site has two sections,

So it goes for all the internal links on the site — images, js and css files, hyperlinks or any other resource that can be clicked on or loaded on the page.

For the local resources it’s better to make it path only, without protocol and domain — like /job/vacancy.php. Whereas for the external resources these attributes are obligatory, and so it should be a fully qualified URL like http://www.example.com/job/vacancy.php.

Current working directory

The current working directory (also current directory, working directory, CWD) is the key element in relative paths. It’s the directory, from which relative paths being built up.

On a web-server, it’s a directory, where the requested php file stays. So if you are requesting an URL like http://example.com/about/index.php, the current working directory would be:

therefore, all relative paths in the HTML on that page will be interpreted by browser as starting from /about:

And likewise, for PHP all relative paths are starting from /var/www/html/about.

You can get the current working directory using getcwd() function or change it using chdir().

Console scripts. Single entry point

Although technically absolute (starting from a slash), this path is essentially relative to the calling script, because if the calling script will be moved into another directory, it won’t find the configuration file anymore.

This is why it is recommended to use a single entry point for your application. Or — as in our case — two entry points, one for web requests and one for console commands.

So for our fictional application we would have three files — an entry point for the web front, an entry point for console applications and a bootstrap file:

to define the ROOT_DIR constant that contains the path to our application’s root directory (which is directly above the config dir).

And then in both index.php and console.php the

to make all the bootstrap stuff available, including the ROOT_DIR constant. From now on we can use it to build absolute paths starting from the root directory (as long as our scripts are called through the entry point either web or console one):

Example implementations can be found in Laravel’s Artisan or Symfony Console.

Of course, both entry points should implement a sort of resolver to call all other pages and console scripts but that’s slightly out of scope of this article.

Helpful PHP commands and constants

There are may hepful commands and constants in PHP to ease the path interpolation. Some of them are:

An absolute path is a complete path that starts from the root of the file system and includes all the directories and subdirectories needed to get to a specific file or directory. For example, on a Unix-based system, the absolute path to the root directory is “/”.

Absolute paths are important because they provide an unambiguous way to locate a file or directory on the server, regardless of where the script is located or how the script was called.

Относительные и абсолютные пути в HTML (веб-адреса)

В данном случае всё очень просто, мы указываем прямой путь к файлу, лежащему на другом домене. Возможно указание сокращенного пути через использование двух слешей в начале без явного указания http или https и сервер сам подставит нужный протокол (расширение) согласно настройке сервера. Важно заметить, что данный вид является необходимым для перехода между сайтами:

Относительно корня сайта

В данном случае браузер берёт домен сайта и к нему подставляет указанную ссылку. В данном случае получится В случае с http, https не надо париться, так как будет браться в том виде, в котором сейчас открыта страница, то есть при http будет http. Так же очень удобно для переноса некого функционала между разными сайтами или же перенос сайта с одного домена на другой не трогая код. Приоритетный способ указания путей к страницам и файлам.

Относительно данной страницы

Менее востребованный способ, так как он берёт нынешнюю страницу и к её пути дописывает новый адрес. То есть находясь на странице http://school-php.com/trick ссылка на файл будет иметь вид: http://school-php.com/trick/css/style.css . Практически невозможен в использовании в случаях, когда мы используем ЧПУ.

Использование тега base

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

How to Get the Absolute Path in PHP

There are several ways to get the absolute path in PHP. We’ll cover some of the most common methods.

Using the FILE constant

The FILE constant returns the full path and filename of the current file. To get the absolute path of a file, you can use the dirname() function to extract the directory name from the FILE constant. Here’s an example:

This will give you the absolute path of the file that the code is being executed in.

Using the realpath() function

The realpath() function returns the absolute path of a file or directory by resolving any symbolic links or references to parent directories. Here’s an example:

This will give you the absolute path of the file or directory specified by the relative path.

Using the $_SERVER[‘DOCUMENT_ROOT’] variable

This will give you the absolute path of the file or directory relative to the document root.

Using the getcwd() function

The getcwd() function returns the current working directory of the script. You can use this function to construct the absolute path of a file or directory relative to the current working directory. Here’s an example:

Дополнительно:  6 Things You Need to Know About a Front Tooth Root Canal

This will give you the absolute path of the file or directory relative to the current working directory.

Dirname

(PHP 4, PHP 5, PHP 7)

— Возвращает имя родительского каталога из указанного пути

Описание

(
)

Список параметров

На платформах Windows в качестве разделителей имен директорий
используются оба слеша (прямой / и обратный
). В других операционных системах разделителем
служит прямой слеш (/).

Возвращаемые значения

Возвращает путь к родительской директории. Если в параметре
path не содержится слешей, будет возвращена
точка (‘.’), обозначающая текущую директорию.
В другом случае будет возвращен path
без последнего компонента /component.

Список изменений

Пример #1 Пример использования функции

Функция наивно оперирует исключительно
исходной строкой и не учитывает реальную файловую систему
или компоненты пути типа «..».

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

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

Посмотрите следующий пример, иллюстрирующий эти изменения:

Вернуться к: Файловая система

Относительные и абсолютные пути в PHP

Всё очень просто, работая в файловой системе мы будем придерживаться правил работы с путями в PHP. Если же мы передаём команду в браузер клиента, то тут используются пути HTML. То есть в следующем примере у нас из PHP передаётся путь браузеру с страницей, на которую ему надо перейти. То, что переход между страницами браузер осуществил можно увидеть в адресной строке:

Итого, открываем страницу page1.php, а в адресной строке записано page2.php, а всё дело в том, что браузер СНАЧАЛА загрузил страницу page1.php, а потом получил информацию с переадресацией и ЗАГРУЗИЛ страницу вторую page2.php. В данном случае переадресация была на стороне клиента (браузера), а значит используем правила относящиеся к HTML (веб-адрес).

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

Абсолютный путь в PHP воспринимается как абсолютный путь от директории, в которой установлен веб-сервер. Данный путь можно получить из:

Если взять в пример этот сервер, то его путь: /home/school/public_html/schoolphp , значит для того, чтобы указать полный путь к фотографии ‘/photo/img1.jpg’, необходимо указать такой путь:

Хочу заметить, что сайт может располагаться в поддиректории, то есть для:

может быть крайне затруднительно использование DOCUMENT_ROOT, ведь форум (как внешний скрипт) ещё не знает где будет размещаться на сайте. Справиться с данной проблемой можно несколькими способами, давайте парочку перечислим:

1) Создать в виде поддомена страницу.

2) Прописать абсолютный путь в конфиге в config.php , то есть:

Теперь можно без угрызения совести привязать весь сайт на Core::$ROOT, и если случайным образом необходимо поменять путь до подключаемого файла, то можно переопределить значение Core::$ROOT;

Относительно стартового файла (базового)

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

В данном случае будет подключен allpages.php по пути: /home/school/public_html/schoolphp/modules/allpages.php . Данный способ удобен тем, что если прописать include в файле allpages.php: include ‘./modules/module/page.php’;, то искать его будет всё равно относительно точки входа, а именно index.php:

Достаточно удобная реализация учесть, что мы чётко знаем структуру нашего приложения относительно корневого index.php. Даже если мы вызываем любой другой файл, а не index.php, то работать пути будут абсолютно точно так же. Вызвали мы dir.php , значит относительно файла dir.php и будут браться пути!

Что ещё надо знать

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

В данном случае будет браться директория данного файла или корневого index.php, и возвращаться на 1 папку назад, там же будет искаться файл ‘file.php’.

DOCUMENT_ROOT не единственный вариант получить корневой путь сайта. Давайте взглянем в мануал: «Директория корня документов, в которой выполняется текущий скрипт, в точности та, которая указана в конфигурационном файле сервера.». Это значит, что в случаях, если в конфигурационном файле будет некорректно написан путь, то весь сайт не будет работать. Что делать? Можно писать админам и владельцам хостинга, на котором размещается сервер с надеждой, что они исправят свои недочёты. Или искать стабильную альтернативу, которой является __DIR__ , это абсолютный путь к данному файлу, где запущен код файлу. Допустим файл конфигурации у нас лежит в папке config, и чтобы используя __DIR__ не возвращаться каждый раз на 1 папку наверх записью __DIR__’/../’ мы смело можем __DIR__ записать в свою переменную, примером ниже я записал в свойство класса (урок №24, кто не дошел используйте обычную переменную):

Core::$ROOT = __DIR__; // Или же для старых PHP — dirname(__FILE__);

Так же хотелось напомнить кое-что интересное и важное. Согласно безопасности веб-сервер запрещает перемещение по директориям выше корня сайта. То есть сайт находится по следующему пути: /home/school/public_html/schoolphp , но прочитать содержание папок /home, или /home/school будет недоступно.

Может ли PHP пользоваться путями HTML ? Да, в специальных функциях, для примера:

Практика

В своих старых проектах я использовал DOCUMENT_ROOT, сейчас перешел на относительные index.php пути ‘./папка/файл’.

Zend2, продукт от разработчиков PHP, один из самых сложных FrameWork на данный момент использует так же относительные пути с отличным синтаксисом от моего, то есть ‘папка/файл’.

Форум IPB.3 использует dirname(__FILE__).

Выводы

1) В HTML используем пути относительно корня сайта, а именно ‘/file.php’ (Строка начинается со слэша).
2) в PHP используем относительно корневого файла ‘./file.php’ (Строка начинается с точки и слэша), альтернативой может быть использование свойства, инициализированного в корне: __DIR__;
3) Переадресация header использует пути из HTML. PHP работая с файловой системой (подключение файлов, сохранение и редактирование изображений) — с PHP путями.

Оцените статью
Master Hi-technology
Добавить комментарий