我已经搜索了高低,并获得了许多不同的解决方案和包含信息的变量来获取绝对路径。但它们似乎在某些条件下工作而不在其他条件下工作。是否有一种银弹方式来获取PHP中执行脚本的绝对路径?对我来说,脚本将从命令行运行,但是,如果在Apache等中运行,解决方案也应该正常运行。
澄清:最初执行的脚本,不一定是编码解决方案的文件。
答案 0 :(得分:259)
__FILE__
常量将为您提供当前文件的绝对路径。
<强>更新强>:
问题已更改为询问如何检索最初执行的脚本而不是当前运行的脚本。唯一(??)可靠方法是使用debug_backtrace
函数。
$stack = debug_backtrace();
$firstFrame = $stack[count($stack) - 1];
$initialFile = $firstFrame['file'];
答案 1 :(得分:247)
示例: https://(www.)example.com/subFolder/myfile.php?var=blabla#555
// ======= PATHINFO ====== //
$x = pathinfo($url);
$x['dirname'] https://example.com/subFolder
$x['basename'] myfile.php?
$x['extension'] php?k=blaa#12345 // Unsecure! also, read my notice about hashtag parts
$x['filename'] myfile
// ======= PARSE_URL ====== //
$x = parse_url($url);
$x['scheme'] https
$x['host'] example.com
$x['path'] /subFolder/myfile.php
$x['query'] k=blaa
$x['fragment'] 12345 // ! read my notice about hashtag parts
//=================================================== //
//========== 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 //similar: $_SERVER["SERVER_PROTOCOL"]
$_SERVER['HTTP_HOST'] example.com (or with WWW) //similar: $_SERVER["ERVER_NAME"]
$_SERVER["REQUEST_URI"] /subFolder/myfile.php?k=blaa
$_SERVER["QUERY_STRING"] k=blaa
__FILE__ /home/user/public_html/subFolder/myfile.php
__DIR__ /home/user/public_html/subFolder //same: dirname(__FILE__)
$_SERVER["REQUEST_URI"] /subFolder/myfile.php?k=blaa
parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH) /subFolder/myfile.php
$_SERVER["PHP_SELF"] /subFolder/myfile.php
// ==================================================================//
//if "myfile.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/myfile.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) myfile.php
//excellent solution to find origin
$debug_files = debug_backtrace();
$caller_file = count($debug_files) ? $debug_files[count($debug_files) - 1]['file'] : __FILE__;
注意:
DIRECTORY_SEPARATOR
返回\
用于Windows类型的托管,而不是/
。
//(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/
答案 2 :(得分:235)
echo realpath(dirname(__FILE__));
如果将其放在包含的文件中,则会打印此包含的路径。要获取父脚本的路径,请将__FILE__
替换为$_SERVER['PHP_SELF']
。但请注意,PHP_SELF存在安全风险!
答案 3 :(得分:34)
__DIR__
来自the manual:
该文件的目录。如果在include中使用,则返回包含文件的目录。这相当于dirname(__FILE__)
。除非它是根目录,否则此目录名称没有尾部斜杠。
__FILE__
始终包含已解析符号链接的绝对路径,而在旧版本(而不是4.0.2)中,它在某些情况下包含相对路径。
注意:在PHP 5.3.0中添加了__DIR__
。
答案 4 :(得分:22)
正确的解决方案是使用get_included_files
函数:
list($scriptPath) = get_included_files();
即使出现以下情况,这也会为您提供初始脚本的绝对路径:
这是两个测试脚本;主脚本和包含文件:
# 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
答案 5 :(得分:19)
如果您想获取当前工作目录,请使用getcwd()
http://php.net/manual/en/function.getcwd.php
__FILE__
将返回带有文件名的路径,例如在XAMPP C:\xampp\htdocs\index.php
上而不是C:\xampp\htdocs\
答案 6 :(得分:7)
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/
答案 7 :(得分:6)
请使用以下内容:
public sealed partial class MyPage : Page
{
public List<String> myList { get; set; }
public MyPage()
{
this.InitializeComponent();
myList = new List<string>()
{
"hello",
"this",
"is",
"me"
}; //This is the ItemSource for the ListView
...
}
public void SetUpUI(int selectedItem) //This method is called from
{ //the OnLaunched() method
MyListView.SelectedIndex = selectedItem;
}
...
}
答案 8 :(得分:4)
如果您正在寻找相对于服务器根目录的绝对路径,我发现这很有效:
$_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['SCRIPT_NAME'])
答案 9 :(得分:4)
`realpath(dirname(__FILE__))`
它为您提供当前脚本(您放置此代码的脚本)目录,而不是尾随斜杠。 如果要包含结果为
的其他文件,这一点很重要答案 10 :(得分:3)
这是我为此精确编写的一个有用的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;
}
答案 11 :(得分:2)
这就是我使用的方法,它可以在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']);
}
答案 12 :(得分:1)
在您的脚本上试试
echo getcwd() . "\n";
答案 13 :(得分:1)
realpath($_SERVER['SCRIPT_FILENAME'])
对于在Web服务器$_SERVER['SCRIPT_FILENAME']
下运行的脚本,将包含最初调用脚本的完整路径,因此可能是index.php。在这种情况下,不需要realpath()
。
从控制台$_SERVER['SCRIPT_FILENAME']
运行的脚本将包含当前工作目录中最初调用的脚本的相对路径。因此,除非您更改脚本中的工作目录,否则它将解析为绝对路径。
答案 14 :(得分:1)
从&#34; main&#34;检索最初执行的脚本的绝对路径的最简单方法脚本和include
,require
,require_once
中包含的任何脚本都是将其存储在主脚本开头的常量中:
define( 'SCRIPT_ROOT', __FILE__ );
__FILE__
返回当前脚本的路径。在包含的脚本中使用返回包含文件的路径,而不是最初作为OP请求的脚本:
澄清:最初执行的脚本,而不是我们当前的文件
将__FILE__
存储到常量中的解决方案比使用debug_backtrace()
上面的解决方案适用于单个&#34; main&#34; include
所有其他所需脚本的脚本,与大多数Web应用程序一样。
如果情况并非如此,并且可能有几个&#34; intital脚本&#34;然后为了避免重新定义并在每个脚本中以正确的路径存储每个脚本,可以从以下开始:
if( ! defined( 'SCRIPT_ROOT' ) ) {
define( 'SCRIPT_ROOT`, __FILE__ );
}