Я искал максимум и минимум и получал множество различных решений и переменных, содержащих информацию, чтобы получить абсолютный путь. Но они, кажется, работают в одних условиях, а не в других. Есть ли один способ «серебряной пули» получить абсолютный путь к исполняемому скрипту в PHP? Для меня сценарий будет запускаться из командной строки, но решение должно работать так же хорошо, если оно выполняется в Apache и т. Д.
Уточнение. Первоначально выполняемый сценарий, не обязательно файл, в котором закодировано решение.
Ответы:
Правильное решение - использовать
get_included_files
функцию:Это даст вам абсолютный путь к исходному сценарию, даже если:
Вот два тестовых сценария; основной скрипт и включенный файл:
И результат; обратите внимание на текущий каталог:
источник
get_included_files()
. Я предлагаю сохранить__FILE__
в константу в начале скрипта, предназначенного для первоначального запуска.__FILE__
Константа даст вам абсолютный путь к текущему файлу.Обновление :
Вопрос был изменен, чтобы спросить, как получить первоначально выполненный сценарий вместо текущего запущенного сценария. Единственный (??) надежный способ сделать это - использовать
debug_backtrace
функцию.источник
__FILE__
местоположение index.php или местоположение включенного файла? Как бы я получить местоположение index.php?__FILE__
указывает на путь текущего скрипта. Но я не нашел ничего, чтобы показать текущий путь index.php.Ответ был перемещен здесь - https://stackoverflow.com/a/26944636/2377343
источник
str_replace( basename(__FILE__) , '',str_replace($_SERVER["DOCUMENT_ROOT"],'',str_replace('\\','/',__FILE__ ) ) ) === /folder1/folder2/
Если вы поместите это во включаемый файл, он напечатает путь к этому включению. Чтобы получить путь к родительскому сценарию, замените его
__FILE__
на$_SERVER['PHP_SELF']
. Но учтите, что PHP_SELF - это угроза безопасности!источник
__FILE__
всегда содержит абсолютный путь с разрешенными символическими ссылками, тогда как в более старых версиях он содержал относительный путь при некоторых обстоятельствах». plus "dirname () наивно работает с входной строкой и не знает о фактической файловой системе или компонентах пути, таких как '..'.PHP_SELF
??Из руководства :
Примечание :
__DIR__
было добавлено в PHP 5.3.0.источник
Если вы хотите получить текущий рабочий каталог, используйте
getcwd()
http://php.net/manual/en/function.getcwd.php
__FILE__
вернет путь с именем файла, например, на XAMPPC:\xampp\htdocs\index.php
вместоC:\xampp\htdocs\
источник
даст абсолютный маршрут текущего файла, из которого вы запрашиваете маршрут, маршрут вашего каталога сервера.
файлы примеров:
www / http / html / index.php; если вы поместите этот код в ваш index.php, он вернет:
<?php echo dirname(__FILE__); // this will return: www/http/html/
www / http / html / class / myclass.php; если вы поместите этот код в myclass.php, он вернется:
<?php echo dirname(__FILE__); // this will return: www/http/html/class/
источник
Просто используйте ниже:
источник
a.php->b.php->c.php
должно быть путем a.php, если проверено в c.php . Единственный надежный способ - использовать функцию debug_backtrace () .он дает вам текущий каталог скриптов (скрипт, в котором вы разместили этот код) без косой черты. это важно, если вы хотите включить другие файлы с результатом
источник
Если вы ищете абсолютный путь относительно корня сервера, я обнаружил, что это работает хорошо:
источник
Вот полезная функция PHP, которую я написал для этого точно. Как поясняет исходный вопрос, он возвращает путь, по которому был выполнен исходный скрипт, а не файл, в котором мы сейчас находимся.
источник
попробуйте это на вашем сценарии
источник
Для запуска скрипта под веб-сервером
$_SERVER['SCRIPT_FILENAME']
будет указан полный путь к изначально вызываемому скрипту, поэтому, вероятно, ваш index.php.realpath()
не требуется в этом случае.Поскольку скрипт, запускаемый из консоли,
$_SERVER['SCRIPT_FILENAME']
будет содержать относительный путь к вашему первоначально вызванному скрипту из вашего текущего рабочего каталога. Поэтому, если вы не изменили рабочий каталог внутри вашего скрипта, он будет преобразован в абсолютный путь.источник
Это то, что я использую, и это работает в среде Linux. Я не думаю, что это будет работать на компьютере с Windows ...
источник
Простой способ иметь абсолютный путь , первоначально выполненного сценария , в этом сценарии и любой другой сценарий с включенным
include
,require
,require_once
является использование константы и хранения есть текущий путь сценария в начале основного скрипта :Приведенное выше решение подходит, когда есть один «основной» сценарий, который содержит
include
все остальные необходимые сценарии, как в большинстве веб-приложений.Если это не так, и может быть несколько «базовых сценариев», то во избежание переопределений и сохранения правильного пути внутри константы каждый сценарий может начинаться с:
Примечание о (в настоящее время) принятом ответе :
в ответе указывается, что изначально выполненный путь к сценарию является первым элементом массива, возвращаемого функцией
get_included_files()
.Это умное и простое решение, и - на момент написания - (мы почти на PHP 7.4.0) оно работает .
Однако, глядя на документацию, нет никаких упоминаний о том, что первоначально выполненный скрипт является первым элементом массива, возвращаемого
get_included_files()
.Мы только читаем
На момент написания « первоначально названный скрипт » был первым в массиве, но - технически - нет никакой гарантии, что это не изменится в будущем.
Примечание о
realpath()
,__FILE__
и__DIR__
:Другие предположили в своих ответах на использование
__FILE__
,__DIR__
,dirname(__FILE__)
,realpath(__DIR__)
...dirname(__FILE__)
равно__DIR__
(введено в PHP 5.3.0), так что просто используйте__DIR__
.И то,
__FILE__
и другое__DIR__
всегда являются абсолютными путями, поэтому нетrealpath()
необходимости.источник