获取当前脚本的绝对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";