获取当前脚本的绝对path
我search了高和低,并获得了很多不同的解决scheme和包含信息的variables来获取绝对path。 但他们似乎在某些条件下工作,而不是在其他条件下工作。 有没有一个银子弹的方式来获取当前执行脚本的绝对path在PHP? 对我来说,脚本将从命令行运行,但它应该也是如果在Apache等运行的function
澄清:最初执行的脚本,而不是我们目前所在的文件
__FILE__
常量会给你当前文件的绝对path。
UPD :
只要问题被改变以检索启动运行时的脚本,唯一debug_backtrace
方法就是使用debug_backtrace
函数。
$stack = debug_backtrace(); $firstFrame = $stack[count($stack) - 1]; $initialFile = $firstFrame['file'];
echo realpath(dirname(__FILE__));
如果你把它放在一个包含文件中,它会打印这个包含的path。 为了获得父脚本的path,用__FILE__
$_SERVER['PHP_SELF']
replace__FILE__
。 但是请注意,PHP_SELF是一个安全风险!
可视化示例: http://example.com/subFolder/yourfile.php?var=blabla#12345
: http://example.com/subFolder/yourfile.php?var=blabla#12345
典型的PHP代码:
//built-in parse function $x = parse_url($url); $x['scheme'] 🡺 http $x['host'] 🡺 example.com (or with WWW) $x['path'] 🡺 /subFolder/yourfile.php $x['query'] 🡺 var=blabla $x['fragment'] 🡺 12345 // hashtag outputed only in case, when hashtag-containing link was manually passed to function //self-defining SERVER variables $_SERVER["DOCUMENT_ROOT"] 🡺 /home/user/public_html $_SERVER["SERVER_ADDR"] 🡺 143.34.112.23 $_SERVER["SERVER_PORT"] 🡺 80 $_SERVER["REQUEST_SCHEME"]🡺 http //similar: $_SERVER["SERVER_PROTOCOL"] $_SERVER['HTTP_HOST'] 🡺 example.com (or with WWW) //similar: $_SERVER["ERVER_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 //same: 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 =========================// //To trim values to filename, ie basename(__FILE__ *or* $url) 🡺 yourfile.php pathinfo(parse_url($url)['path'], PATHINFO_EXTENSION) 🡺 php //If site uses HTTPS: $prefix = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS']!=='off') || $_SERVER['SERVER_PORT']==443) ? 'https://':'http://' ); //in some cases, you need to add this condition too: if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') ... //excellent solution to find origin $debug_files = debug_backtrace(); $initial_called_file = count($debug_files) ? $debug_files[count($debug_files) - 1]['file'] : __FILE__;
注意:
-
hastag(#…)url部分不能从PHP(服务器端)检测到。 为此,请使用Javascript。
-
DIRECTORY_SEPARATOR
返回\
为Windowstypes主机,而不是/
。
对于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/ // ps If you reuse them frequently in your plugin, I advise to definethem at first and reuse them easily ie `define('myThemeUrl', ......... ); `
__DIR__
文件的目录。 如果在include中使用,则返回包含文件的目录。 这相当于
dirname(__FILE__)
。 除非目录名是根目录,否则该目录名没有结尾的斜杠。
getcwd()
是正确的答案 – http://php.net/manual/en/function.getcwd.php
__FILE__
将返回带有文件名的path,例如在XAMPP C:\xampp\htdocs\index.php
你想要的是获得当前的工作目录,所以使用getcwd()
来获取C:\xampp\htdocs\
dirname(__FILE__)
将给出你要求路由的当前文件的绝对路由,你的服务器目录的路由。
示例文件:
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/
只需使用下面:
echo __DIR__;
如果你正在寻找相对于服务器根目录的绝对path,我发现这个效果很好:
$_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['SCRIPT_NAME'])
`realpath(dirname(__FILE__))`
它为您提供当前的脚本(您在其中放置此代码的脚本)目录,而不使用斜线。 如果你想包含结果的其他文件,这是非常重要的
下面是我为此精心编写的一个有用的PHP函数。 正如最初的问题所阐明的那样,它会返回执行初始脚本的path – 而不是我们当前所在的文件。
/** * 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; }
在使用框架的情况下,他们中的大多数是不工作的,所以我find了解决scheme。 码:
echo dirname(__FILE__).'\\'.basename(__FILE__);
它应该给绝对path,包括文件名。
realpath($_SERVER['SCRIPT_FILENAME'])
对于在web服务器下运行的脚本$_SERVER['SCRIPT_FILENAME']
将包含最初调用脚本的完整path,所以可能是你的index.php。 在这种情况下realpath()
不是必需的。
对于从控制台$_SERVER['SCRIPT_FILENAME']
运行的脚本$_SERVER['SCRIPT_FILENAME']
将包含您当前工作目录中最初调用脚本的相对path。 所以除非你在脚本里面改变了工作目录,否则它会parsing成绝对path。
试试你的脚本
echo getcwd() . "\n";