- Tarlyun blog
- Способ 1. Некрасивый
- Плюсы данного решения
- Минусы данного решения
- Способ 2. Элегантный, но не идеальный
- Плюсы
- Минусы
- Способ 3. Нет предела совершенству
- Find Root Directory Path in PHP
- Use the __DIR__ Predefined Constant to Find the Path of the Directory of a File in PHP
- Use the dirname() Function to Find the Path of the Root Directory of a Project in PHP
- Use $_SERVER[‘DOCUMENT_ROOT’] to Find the Document Root Directory of a File in PHP
- Document Root in PHP
- $_SERVER in PHP
- DOCUMENT_ROOT in PHP
Tarlyun blog
Часто возникает необходимость подгрузить из одного скрипта другой. Всё хорошо, когда эти скрипты физически расположены в одном каталоге. Делаем include и нет проблем. Проблемы возникают при развитой системе скриптов. Когда исполняемые файлы сгруппированы по каталогам и нужно настроить взаимодействие между ними.
Для себя я решил, что проще всего понять где находится корневой каталог и уже от него подгружать другие скрипты.
Способ 1. Некрасивый
Способ, которым я пользовался более трех лет. Основная идея: получить путь к каталогу текущего файла и относительно этого каталога подгружать другие скрипты.
В переменной $_SERVER[«SCRIPT_FILENAME»] содержится абсолютный путь к скрипту. С помощью функций mb_strrpos и mb_substr мы вырезаем из исходной строки имя файла. В итоге в константе PATH будет содержаться текущий каталог.
define ('PATH', mb_substr($_SERVER["SCRIPT_FILENAME"], 0, mb_strrpos($_SERVER["SCRIPT_FILENAME"], "/"))); require_once(PATH."/../connect.php");
define (‘PATH’, mb_substr($_SERVER[«SCRIPT_FILENAME»], 0, mb_strrpos($_SERVER[«SCRIPT_FILENAME»], «/»))); require_once(PATH.»/../connect.php»);
Плюсы данного решения
– Должен работать даже на самых древних версиях PHP.
– Инициализация константы происходит в одну строку.
Минусы данного решения
– В зависимости от вложенности скрипта, необходимо менять количество «../» . То есть, если вложенность один каталог:
require_once(PATH."/../connect.php");
Если вложенность 4 каталога:
require_once(PATH."/../../../../connect.php");
– Весь этот код вообще не нужен ведь, начиная с PHP 5.3, появилась константа __DIR__ , которая содержит путь к каталогу.
– При запуске скрипта с консоли в $_SERVER[«SCRIPT_FILENAME»] будет содержаться относительный путь. То есть, если вы запускаете скрипт так:
php /var/www/sites/lgnd.ru/public_html/parser/test.php
В $_SERVER[«SCRIPT_FILENAME»] будет содержаться полный путь.
Но если вы сначала перейдете в каталог скрипта, а затем запустите его:
cd /var/www/sites/lgnd.ru/public_html/parser/test.php php test.php
cd /var/www/sites/lgnd.ru/public_html/parser/test.php php test.php
то в $_SERVER[«SCRIPT_FILENAME»] будет содержаться только test.php
– На некоторых конфигурациях содержимое $_SERVER[«SCRIPT_FILENAME»] может быть пустым.
Способ 2. Элегантный, но не идеальный
В какой-то момент мне надоело постоянно менять вложенность. И я решил переписать этот говнокод.
Начиная с PHP 5.3, появилась удобная константа __DIR__ . Почему бы не воспользоваться ею?
Для начала определим: какое название имеет корневой каталог. В зависимости от настроек вашего веб-сервера, это может быть public_html , public , www или что-то другое. В константе __DIR__ будет такой путь:
/var/www/sites/lgnd.ru/public_html/parser
При помощи функции explode мы разобьем этот путь на две части. Разделителем будет служить название корневого каталога (в моем случае — public_html ). В итоге в $dir[0] будет содержаться левая часть (всё, что было до public_html ):
/var/www/sites/lgnd.ru/
К этой строке мы добавляем название корневого каталога и слэш.
$root_dir = 'public_html'; $dir = explode($root_dir, __DIR__); define ('PATH', $dir[0].$root_dir.'/'); require_once(PATH."/connect.php");
$root_dir = ‘public_html’; $dir = explode($root_dir, __DIR__); define (‘PATH’, $dir[0].$root_dir.’/’); require_once(PATH.»/connect.php»);
Плюсы
– Будет корректно определён путь до корневого каталога, вне зависимости от вложенности скрипта.
– Нет проблем с относительным/абсолютным путем при работе из командной строки или при запуске в экзотических конфигурациях
– Не нужно постоянно указывать дополнительные «../» при переносе скрипта в другой каталог.
Минусы
– Требует PHP 5.3+
– Инициализация занимает больше строк и её нельзя сократить (записать три строки в одну не комильфо)
– Требует указания корневого каталога, а значит скрипт нельзя просто скопировать с одного сервера на другой
Способ 3. Нет предела совершенству
Дальнейшие улучшения способа номер 2.
В PHP 5.4 появилось разыменование массивов. Эта штука позволяет обращаться к результатам работы функции explode без создания временной переменной:
$dir = explode('public_html', __DIR__); echo dir[0];
$dir = explode(‘public_html’, __DIR__); echo dir[0];
echo explode('public_html', __DIR__)[0];
echo explode(‘public_html’, __DIR__)[0];
В итоге код из способа 2 становится более компактным:
$root_dir = 'public_html'; define ('PATH', explode($root_dir, __DIR__)[0].$root_dir.'/');
$root_dir = ‘public_html’; define (‘PATH’, explode($root_dir, __DIR__)[0].$root_dir.’/’);
А если очень хочется всё записать в одну строку:
define ('PATH', explode('public_html', __DIR__)[0].'public_html'.'/');
define (‘PATH’, explode(‘public_html’, __DIR__)[0].’public_html’.’/’);
Find Root Directory Path in PHP
- Use the __DIR__ Predefined Constant to Find the Path of the Directory of a File in PHP
- Use the dirname() Function to Find the Path of the Root Directory of a Project in PHP
- Use $_SERVER[‘DOCUMENT_ROOT’] to Find the Document Root Directory of a File in PHP
We will introduce different methods to find the path of the root directory of a PHP project.
Use the __DIR__ Predefined Constant to Find the Path of the Directory of a File in PHP
In PHP, there are predefined constants that can be used to achieve various functionalities. __DIR__ is one magical constant that returns the complete file path of the current file from the root directory. It means it will return the file’s directory. dirname(__FILE__) can also be used for the same purpose.
Suppose we have a project folder which is the root directory of the project. The project folder has the following file path /var/www/HTML/project . Inside the project folder, we have the index.php file and another folder master . Inside the master folder, we have two PHP files: login.php and register.php .
project ├── index.php └── master ├── login.php └── register.php
Suppose we are currently working on login.php . In such a file structure, we can get the directory’s path using the __DIR__ constant in the login.php file. We can use the echo function to print the constant.
Use the dirname() Function to Find the Path of the Root Directory of a Project in PHP
The function dirname(__FILE__) is similar to __DIR__ . We can find the path of the directory of a file using this function. We can also move to the upper levels in the file path using the dirname() function. The first parameter of the function is the path of the file, which is denoted by the __FILE__ constant. The second parameter is an integer which is called levels. We can set the levels to direct the function to level up in the file path. The default value of the level is 1 . As we increase the level, the function will get the file path of one level up. So, we can use this function to find the exact file path of the project’s root directory in PHP.
For example, we can consider the file structure as the first method. Working from the file, login.php , we can use the dirname() function with level 2 and the __FILE__ constant as parameters. Then we can get the exact file path of the working directory. Thus, we can change the levels according to our choice to move upward and downward in the file path. In this way, we can find the path of the root directory of the project in PHP.
php echo dirname(__FILE__,2); ?>
Use $_SERVER[‘DOCUMENT_ROOT’] to Find the Document Root Directory of a File in PHP
We can use the $_SERVER[] array with the DOCUMENT_ROOT indices to find the document root directory of the currently executing script. It will return the complete path of the document root directory. It is defined in the configuration file in the server. For the file structure above, we can print the $_SERVER[‘DOCUMENT_ROOT’] with the echo function to find the document root directory of the file login.php .
As shown in the output below, we found out the path html is the document root directory of the login.php file. We can see the file path of the root directory as well.
php echo $_SERVER['DOCUMENT_ROOT']; ?>
Document Root in PHP
- $_SERVER in PHP
- DOCUMENT_ROOT in PHP
Your PHP script may need the root directory name in which the script is currently executing. This article will introduce how to get the directory name of the current script inside the project.
$_SERVER in PHP
$_SERVER is an array that contains information about headers, paths, and script locations. The webserver creates all this information. You can use an array to get details of a specific location, like PHP_SELF , SCRIPT_NAME , DOCUMENT_ROOT , etc.
DOCUMENT_ROOT in PHP
It’s not advisable to set the static path for any file because the change of root path will lead to a failure if the path inside the script is not changed. $_SERVER contains information about the document root directory under which the current script is executing. It is accessible via the variable DOCUMENT_ROOT , as defined in the server’s configuration file. This is the path where your application code is stored.
The main difference between DOCUMENT_ROOT & / in HTML file is that it first renders an actual file path & later renders the root of the server URL. So if you want a file path relative to the server, you need to add $_SERVER[‘DOCUMENT_ROOT’]./’helloworld.html’ but if you want it relative to your website, just use /helloworld.html .
php echo $_SERVER['DOCUMENT_ROOT']; ?>
Shraddha is a JavaScript nerd that utilises it for everything from experimenting to assisting individuals and businesses with day-to-day operations and business growth. She is a writer, chef, and computer programmer. As a senior MEAN/MERN stack developer and project manager with more than 4 years of experience in this sector, she now handles multiple projects. She has been producing technical writing for at least a year and a half. She enjoys coming up with fresh, innovative ideas.