
В PHP имя текущего исполняемого файла можно получить с помощью суперглобальных переменных. Наиболее прямой способ – использовать $_SERVER[‘PHP_SELF’]. Эта переменная возвращает путь к текущему скрипту относительно корня веб-сервера. Например, если файл находится по адресу /var/www/site/page.php, а доступ к нему осуществляется по URL https://example.com/site/page.php, значение $_SERVER[‘PHP_SELF’] будет /site/page.php.
Если необходимо получить только имя файла без пути, можно использовать функцию basename(). В связке с $_SERVER[‘PHP_SELF’] это выглядит так: basename($_SERVER[‘PHP_SELF’]). Результатом будет page.php.
Другой способ – переменная __FILE__, которая содержит абсолютный путь до текущего файла. Это полезно при работе вне контекста веб-запроса, например, в CLI-скриптах. Чтобы извлечь имя файла из __FILE__, также используется basename(__FILE__).
Если скрипт подключается через include или require, и важно получить имя основного файла, стоит использовать $_SERVER[‘SCRIPT_NAME’] или $_SERVER[‘SCRIPT_FILENAME’]. Первый возвращает путь относительно корня, второй – полный абсолютный путь.
Для исключения символов или параметров, переданных в URL, не стоит использовать $_SERVER[‘REQUEST_URI’], так как она возвращает весь URI, включая GET-параметры.
Получение имени текущего скрипта с помощью __FILE__
Константа __FILE__ возвращает полный путь к текущему файлу, включая имя. Это абсолютный путь, сформированный интерпретатором PHP на момент выполнения скрипта.
Пример:
<?php
echo __FILE__;
?>
<?php
echo basename(__FILE__);
?>
Результат: index.php.
Если необходимо получить имя файла без расширения:
<?php
echo pathinfo(__FILE__, PATHINFO_FILENAME);
?>
Результат: index.
Константа __FILE__ надёжна даже при подключении файла через include или require: она всегда указывает на физический путь файла, в котором используется. Это отличает её от $_SERVER['SCRIPT_FILENAME'], которая указывает на главный исполняемый файл.
Разница между __FILE__ и $_SERVER[‘SCRIPT_FILENAME’]
![Разница между __FILE__ и $_SERVER['SCRIPT_FILENAME']](/wp-content/images3/kak-poluchit-imya-fajla-php-kbfpqkb4.jpg)
Константа __FILE__ возвращает полный путь к текущему файлу, в котором она используется. Это значение жёстко связано с физическим расположением файла на диске и не зависит от точки входа в приложение.
$_SERVER['SCRIPT_FILENAME'] показывает путь к исполняемому скрипту, то есть тому, который был запрошен напрямую через веб-сервер. Если основной файл – index.php, а подключается include/config.php, то __FILE__ в config.php вернёт путь к самому config.php, а $_SERVER['SCRIPT_FILENAME'] – к index.php.
Для работы с подключаемыми модулями лучше использовать __FILE__, так как оно позволяет точно определить местоположение текущего файла. $_SERVER['SCRIPT_FILENAME'] уместен для логирования или случаев, где важно знать главный исполняемый скрипт.
Если требуется сформировать абсолютные пути относительно текущего файла, используйте dirname(__FILE__). Для определения основной точки входа приложения $_SERVER['SCRIPT_FILENAME'] более пригоден.
Как получить только имя файла без пути
Для получения имени текущего PHP-файла без директории используют функцию basename(). Она извлекает имя файла из полного пути.
basename(__FILE__)– вернёт имя исполняемого файла, например:index.phpbasename($_SERVER['PHP_SELF'])– вернёт имя скрипта, указанного в URL, без параметровpathinfo(__FILE__, PATHINFO_BASENAME)– альтернативаbasename()с тем же результатом
Если необходимо убрать расширение:
pathinfo(__FILE__, PATHINFO_FILENAME)– вернёт только имя без.phpbasename(__FILE__, '.php')– аналогичный результат при указании нужного расширения
Если имя берётся из произвольного пути:
$path = '/var/www/site/page.php';
$name = basename($path); // 'page.php'
$name_no_ext = pathinfo($path, PATHINFO_FILENAME); // 'page'
Если путь может содержать символы в разных кодировках, убедись, что они обрабатываются корректно через mb_basename() (при наличии в окружении).
Использование basename() для извлечения имени файла

Функция basename() предназначена для получения имени файла из полного пути. Она принимает строку пути и, при необходимости, удаляет указанное расширение. Это позволяет получить чистое имя файла без каталогов и лишнего суффикса.
Пример базового использования:
$path = '/var/www/html/index.php';
$filename = basename($path);
echo $filename; // index.php
Если требуется избавиться от расширения, укажите его вторым аргументом:
$filename = basename($path, '.php');
echo $filename; // index
Функция работает только со строкой, не взаимодействует с файловой системой. Она не проверяет существование файла и не анализирует путь на уровне ОС. Подходит для обработки путей, полученных от сервера или пользователя.
Для корректной работы с путями на Windows и UNIX-системах рекомендуется избегать обратных слэшей в путях и использовать DIRECTORY_SEPARATOR в других контекстах, где важна кроссплатформенность. Однако basename() корректно обрабатывает и /, и \.
Если путь содержит параметры запроса (например, в URL), необходимо предварительно очистить строку. Пример:
$url = '/files/report.pdf?download=true';
$cleanPath = parse_url($url, PHP_URL_PATH);
$filename = basename($cleanPath);
echo $filename; // report.pdf
Использование basename() особенно актуально при работе с маршрутизацией, загрузкой файлов и ведением логов, где требуется выделить имя без обработки полного пути вручную.
Как определить имя вызывающего скрипта при подключении include

При использовании функции include в PHP, подключаемый файл может потребовать получения информации о файле, который вызвал подключение. Для этого можно воспользоваться переменной $GLOBALS и служебными функциями debug_backtrace() или get_included_files().
Функция debug_backtrace() позволяет получить стек вызовов, где каждый элемент включает информацию о файле, строке и функции, которая была вызвана. Используя этот стек, можно отследить, какой файл стал инициатором вызова include.
Пример кода для получения имени вызывающего скрипта:
Метод get_included_files() возвращает массив всех файлов, которые были подключены с помощью include или require. Этот массив может быть использован для поиска имени файла, который стал инициатором подключения:
Обратите внимание, что при использовании include_once или require_once в цепочке подключений, те же функции могут дать тот же результат, что и для обычных include, но с учётом того, что файл может подключаться только один раз.
Получение имени исполняемого скрипта через $_SERVER[‘PHP_SELF’]
Переменная $_SERVER[‘PHP_SELF’] возвращает путь к текущему исполняемому PHP-скрипту относительно корня веб-сервера. Этот путь включает имя файла и может быть полезен в различных ситуациях, например, при обработке форм или динамическом определении текущего скрипта.
Пример использования:
Результатом будет полный путь к файлу, например, «/index.php» или «/folder/script.php», в зависимости от того, где находится текущий файл на сервере. Важно учитывать, что $_SERVER[‘PHP_SELF’] возвращает путь с учетом текущего скрипта и не включает домен или протокол.
Этот подход защитит от возможных уязвимостей, связанных с внедрением вредоносного кода через параметры запроса.
Проблемы при получении имени файла в CLI-режиме

В обычной ситуации, когда PHP работает через веб-сервер, используется переменная $_SERVER[‘SCRIPT_NAME’], которая возвращает путь до текущего скрипта. Однако в CLI-режиме этой переменной нет. Проблему можно решить с помощью переменной $argv, которая содержит массив аргументов командной строки. Первый элемент этого массива – это имя исполняемого файла.
Пример получения имени файла в CLI-режиме:
Однако эта переменная имеет свои ограничения. Если PHP-скрипт был вызван через абсолютный путь или через символьную ссылку, результат в $argv[0] может отличаться от реального имени скрипта. Например, если путь до файла был передан через сокращение или с другими параметрами, в CLI-режиме может быть возвращен именно этот путь, а не реальное имя скрипта.
Еще одна сложность – это возможность использования обработчиков команд, таких как «php-cli» или других оболочек, которые могут скрывать исходное имя файла. Для точного получения имени файла в таких случаях можно воспользоваться функцией realpath(), которая возвращает абсолютный путь до файла, устраняя возможные символические ссылки и относительные пути.
Пример использования realpath() для получения точного пути:
Этот подход позволяет получить корректное имя файла, независимо от того, через какой путь был вызван скрипт, и устраняет проблемы с символьными ссылками.
В целом, для работы с именем файла в CLI-режиме важно учитывать как особенности самого PHP, так и возможные особенности операционной системы и оболочки, через которые выполняется скрипт. Всегда стоит проверять доступные пути и обрабатывать их соответствующим образом для корректной работы скриптов в различных условиях.
Безопасность при работе с путями и именами файлов

При работе с путями и именами файлов важно соблюдать несколько ключевых принципов для обеспечения безопасности приложения.
- Проверка пути на корректность: Перед тем как использовать путь или имя файла, необходимо убедиться, что они соответствуют ожидаемому формату. Например, следует исключить возможность попадания символов, которые могут привести к навигации вне разрешённой директории. Это можно сделать с помощью регулярных выражений, проверяя допустимость символов и длину строки.
- Использование абсолютных путей: Избегайте использования относительных путей для критических операций с файлами. Абсолютный путь исключает риски обхода ограничений на доступ и позволяет чётко контролировать место хранения файлов.
- Проверка на наличие специальных символов: Некоторые символы могут быть использованы для обхода безопасности, например, «../», который позволяет выйти за пределы разрешённой директории. Всегда проверяйте и фильтруйте такие символы.
- Работа с разрешениями: Убедитесь, что файл или директория имеют нужные права доступа. Запрещайте запись и выполнение файлов, если это не требуется для работы приложения.
- Использование функций для безопасной обработки путей: Функции PHP, такие как
basename(),realpath()иdirname(), помогут избежать распространённых уязвимостей, связанных с неправильной обработкой путей. Они могут помочь получить правильное имя файла и удалить лишние или вредоносные символы. - Блокировка исполнения файлов: Веб-сервер должен быть настроен так, чтобы не выполнять PHP-скрипты, загруженные в директории для загрузки файлов. Для этого можно использовать специальную конфигурацию в .htaccess или настройку прав доступа на уровне сервера.
- Межсайтовая атака (Path Traversal): Следует быть особенно внимательным к уязвимостям, связанным с атакой «переход по пути» (Path Traversal). Проверьте все входные данные и убедитесь, что пользователь не может манипулировать путями, чтобы получить доступ к критичным системным файлам.
Поддержание правильной обработки путей и имен файлов – это один из важнейших аспектов безопасности при разработке PHP-приложений. Регулярные проверки и применение рекомендованных методов защиты помогут снизить риски.
Вопрос-ответ:
Как узнать имя текущего PHP-файла на сервере?
Для получения имени текущего PHP-файла можно использовать встроенную переменную `$_SERVER[‘PHP_SELF’]`. Она возвращает путь к скрипту, который был вызван в данный момент. Например, если файл находится в папке `/var/www/html`, то `$_SERVER[‘PHP_SELF’]` может вернуть `/html/filename.php`. Однако стоит учитывать, что если файл перемещается или используется в другом контексте (например, через `include`), путь может измениться. Также можно использовать функцию `basename()` для извлечения только имени файла из полного пути.
