Получить абсолютный путь к текущему скрипту
Я искал повсюду и получал много различных решений и переменных, содержащих информацию, чтобы получить абсолютный путь. Но они, кажется, работают в одних условиях, а не в других. Есть ли один способ серебряной пули, чтобы получить абсолютный путь выполняемого скрипта в PHP? Для меня, скрипт запускается из командной строки, но решение должно функционировать так же хорошо, если работать в Apache и т. д.
уточнение: изначально выполненный скрипт, а не обязательно файл, в котором закодировано решение.
16 ответов:
правильное решение-использовать
get_included_filesфункция:list($scriptPath) = get_included_files();это даст вам абсолютный путь исходного скрипта, даже если:
- эта функция находится в файле
- текущий рабочий каталог отличается от каталога исходного скрипта
- скрипт выполняется с CLI, как относительный путь
вот два тестовых сценария; основной сценарий и прилагаемый файл:
# C:\Users\Redacted\Desktop\main.php include __DIR__ . DIRECTORY_SEPARATOR . 'include.php'; echoScriptPath(); # C:\Users\Redacted\Desktop\include.php function echoScriptPath() { list($scriptPath) = get_included_files(); echo 'The script being executed is ' . $scriptPath; }и результат; обратите внимание на текущий каталог:
C:\>php C:\Users\Redacted\Desktop\main.php The script being executed is C:\Users\Redacted\Desktop\main.php
__FILE__константы даст вам абсолютный путь к текущему файлу.обновление:
вопрос был изменен, чтобы спросить, Как получить первоначально выполняется скрипт вместо текущего скрипта. Единственный (??)надежный способ сделать это-использовать
debug_backtrace
echo realpath(dirname(__FILE__));Если вы делаете это в включить файл, он печатает путь к этому относятся. Чтобы получить путь к родительскому скрипту, замените
__FILE__С$_SERVER['PHP_SELF']. Но имейте в виду, что PHP_SELF-это угроза безопасности!
примеры:
https://(www.)example.com/subFolder/yourfile.php?var=blabla#555типичные PHP коды:
//parse_url $x = parse_url($url); $x['scheme'] https $x['host'] example.com $x['path'] /subFolder/yourfile.php $x['query'] var=blabla $x['fragment'] 555 // hashtag outputed only in case, when hashtag-containing string was manually passed to function, otherwise PHP is unable to recognise hashtags in $_SERVER //pathinfo (If you will ever use this function, I only recommend to pass `parse_url`s output as argument) A = pathinfo($url); B = pathinfo(parse_url($url)['path']); A['dirname'] https://example.com/subFolder B['dirname'] /subFolder A['basename'] yourfile.php?var=blabla#555 B['basename'] yourfile.php A['extension'] php?var=blabla#555 B['extension'] php A['filename'] yourfile B['filename'] yourfile //=================================================== //========== self-defined SERVER variables ========== //=================================================== $_SERVER["DOCUMENT_ROOT"] /home/user/public_html $_SERVER["SERVER_ADDR"] 143.34.112.23 $_SERVER["SERVER_PORT"] 80(or 443 etc..) $_SERVER["REQUEST_SCHEME"] https //like: $_SERVER["SERVER_PROTOCOL"] $_SERVER['HTTP_HOST'] example.com //like: $_SERVER["SERVER_NAME"] $_SERVER["REQUEST_URI"] /subFolder/yourfile.php?var=blabla $_SERVER["QUERY_STRING"] var=blabla __FILE__ /home/user/public_html/subFolder/yourfile.php __DIR__ /home/user/public_html/subFolder //like: dirname(__FILE__) $_SERVER["REQUEST_URI"] /subFolder/yourfile.php?var=blabla parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH) /subFolder/yourfile.php $_SERVER["PHP_SELF"] /subFolder/yourfile.php // ================================================================== //if "YOURFILE.php" is included in "PARENTFILE.php" , and you visit "PARENTFILE.PHP?abc": $_SERVER["SCRIPT_FILENAME"] /home/user/public_html/parentfile.php $_SERVER["PHP_SELF"] /parentfile.php $_SERVER["REQUEST_URI"] /parentfile.php?abc __FILE__ /home/user/public_html/subFolder/yourfile.php // =================================================== // ================= handy variables ================= // =================================================== //If site uses HTTPS: $HTTP_or_HTTPS = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS']!=='off') || $_SERVER['SERVER_PORT']==443) ? 'https://':'http://' ); //in some cases, you need to add this condition too: if ('https'==$_SERVER['HTTP_X_FORWARDED_PROTO']) ... //To trim values to filename, i.e. basename($url) yourfile.php //excellent solution to find origin $debug_files = debug_backtrace(); $initial_called_file = count($debug_files) ? $debug_files[count($debug_files) - 1]['file'] : __FILE__;обратите внимание!:
- хэштегом (#...) Части URL не могут быть обнаружены с PHP (на стороне сервера). Для этого используйте JavaScript.
DIRECTORY_SEPARATORвозвращает\для хостинга типа Windows, вместо/.
Для WordPress
//(let's say, if wordpress is installed in subdirectory: http://example.com/wpdir/) home_url() http://example.com/wpdir/ //if is_ssl() is true, then it will be "https" get_stylesheet_directory_uri() http://example.com/wpdir/wp-content/themes/THEME_NAME [same: get_bloginfo('template_url') ] get_stylesheet_directory() /home/user/public_html/wpdir/wp-content/themes/THEME_NAME plugin_dir_url(__FILE__) http://example.com/wpdir/wp-content/themes/PLUGIN_NAME plugin_dir_path(__FILE__) /home/user/public_html/wpdir/wp-content/plugins/PLUGIN_NAME/
__DIR__С руководство:
Каталог файлов. Если используется внутри include, возвращается каталог включенного файла. Это эквивалентноdirname(__FILE__). Это имя каталога не имеет конечной косой черты, если это не корневой каталог.__FILE__всегда содержит абсолютный путь с разрешенными символическими ссылками, тогда как в более старых версиях (чем 4.0.2) он содержал относительный путь под некоторыми обстоятельства.Примечание:
__DIR__был добавлен в PHP 5.3.0.
если вы хотите получить текущий рабочий каталог использовать
getcwd()http://php.net/manual/en/function.getcwd.php
__FILE__вернет путь с именем файла например на XAMPPC:\xampp\htdocs\index.phpвместоC:\xampp\htdocs\
dirname(__FILE__)даст абсолютная маршруту текущего файла, из которого вы требуете маршрут, маршрут вашего каталога сервера.
файлы примеров :
www / http / html / index.php ; если вы поместите этот код в свой индекс.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/
Если вы ищете абсолютный путь относительно корня сервера, я обнаружил, что это хорошо работает:
$_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['SCRIPT_NAME'])
`realpath(dirname(__FILE__))`Он дает вам текущий скрипт (скрипт, внутри которого вы разместили этот код) каталог без конечной косой черты. это важно, если вы хотите включить другие файлы с результатом
в случае использования платформы, большинство из них не работает, поэтому я нашел решение для этого. Код:
echo dirname(__FILE__).'\'.basename(__FILE__);Он должен дать абсолютный путь, включая имя файла.
вот полезная функция PHP, которую я написал именно для этого. Как уточняет исходный вопрос, он возвращает путь, из которого нач скрипт был выполнен-не тот файл, в котором мы сейчас находимся.
/** * Get the file path/dir from which a script/function was initially executed * * @param bool $include_filename include/exclude filename in the return string * @return string */ function get_function_origin_path($include_filename = true) { $bt = debug_backtrace(); array_shift($bt); if ( array_key_exists(0, $bt) && array_key_exists('file', $bt[0]) ) { $file_path = $bt[0]['file']; if ( $include_filename === false ) { $file_path = str_replace(basename($file_path), '', $file_path); } } else { $file_path = null; } return $file_path; }
realpath($_SERVER['SCRIPT_FILENAME'])для запуска скрипта под веб-сервером
$_SERVER['SCRIPT_FILENAME']будет содержать полный путь к первоначально вызванному скрипту, так что, вероятно, ваш индекс.РНР.realpath()в этом случае не требуется.для запуска скрипта из консоли
$_SERVER['SCRIPT_FILENAME']будет содержать относительный путь к первоначально вызванному скрипту из текущего рабочего каталога. Поэтому, если вы не изменили рабочий каталог внутри вашего скрипта, он будет разрешен к абсолютному пути.
самый простой способ получить абсолютный путь первоначально выполненного сценария из этого" основного " сценария и любого сценария, включенного в
include,require,require_onceэто путем хранения его в константе в начале основного скрипта:define( 'SCRIPT_ROOT', __FILE__ );
__FILE__возвращает путь к текущему сценарию. Используется внутри включенного скрипта возвращает путь к включенному файлу, не скрипт изначально запускается как ОП спрашивает:уточнение: начальный выполненный скрипт, а не файл, в котором мы сейчас находимся
решение о сохранении
__FILE__в константу проще и быстрее, чем получение пути с помощьюdebug_backtrace()
решение выше подходит, когда есть один" основной " скрипт, который
includes каждый другой необходимый скрипт, как и в большинстве веб-приложений.если это не так, и там может быть несколько "intital скрипты", то чтобы избежать переопределения и иметь правильный путь, хранящийся внутри константы каждый скрипт может начинаться с:
if( ! defined( 'SCRIPT_ROOT' ) ) { define( 'SCRIPT_ROOT`, __FILE__ ); }
Это то, что я использую, и он работает в средах Linux. Я не думаю, что это будет работать на машине под Windows...
//define canonicalized absolute pathname for the script if(substr($_SERVER['SCRIPT_NAME'],0,1) == DIRECTORY_SEPARATOR) { //does the script name start with the directory separator? //if so, the path is defined from root; may have symbolic references so still use realpath() $script = realpath($_SERVER['SCRIPT_NAME']); } else { //otherwise prefix script name with the current working directory //and use realpath() to resolve symbolic references $script = realpath(getcwd() . DIRECTORY_SEPARATOR . $_SERVER['SCRIPT_NAME']); }
Comments