获取初始运行脚本的绝对路径

我已经搜索了高和低,得到了很多不同的解决方案和变量包含信息,以获得绝对路径。但它们似乎在某些条件下有效,而在其他条件下无效。有没有一种银弹方法来获得在PHP中执行的脚本的绝对路径?对我来说,脚本将从命令行运行,但是,如果在Apache等中运行,解决方案应该也能正常运行。

澄清:最初执行的脚本,不一定是编码解决方案的文件。

620841 次浏览
echo realpath(dirname(__FILE__));

如果将此文件放在包含的文件中,它将打印该包含的路径。要获得父脚本的路径,将__FILE__替换为$_SERVER['PHP_SELF']。但是请注意PHP_SELF是一个安全风险!

__FILE__常量将为您提供当前文件的绝对路径。

更新:

问题被更改为询问如何检索最初执行的脚本,而不是当前运行的脚本。唯一的(??)可靠的方法是使用debug_backtrace函数。

$stack = debug_backtrace();
$firstFrame = $stack[count($stack) - 1];
$initialFile = $firstFrame['file'];

如果你正在寻找相对于服务器根目录的绝对路径,我发现这很有效:

$_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['SCRIPT_NAME'])

如果你想获取当前工作目录使用getcwd()

http://php.net/manual/en/function.getcwd.php

例如,在XAMPP上__FILE__将返回带有文件名的路径,而不是C:\xampp\htdocs\

dirname(__FILE__)

将给出当前文件的绝对路径,也就是你的服务器目录的路由。

文件示例:

www / http / html / index . php;如果你把这段代码放在index.php中,它将返回:

< p > <代码> & lt; ?php 回声目录名(__FILE__);//返回:www/http/html/

www / http / html /类/ myclass.php;如果你把这段代码放在myclass.php中,它将返回:

< p > <代码> & lt; ?php 回声目录名(__FILE__);//返回:www/http/html/class/

`realpath(dirname(__FILE__))`

它给你当前脚本(脚本里面,你放置这段代码)目录没有结尾斜杠。 如果您想将结果

包含在其他文件中,这很重要
__DIR__

手动:

文件的目录。如果在包含中使用,则返回所包含文件的目录。这相当于dirname(__FILE__)。除非是根目录,否则该目录名没有后面的斜杠。
__FILE__总是包含一个符号链接解析的绝对路径,而在旧版本(高于4.0.2)中,在某些情况下它包含相对路径。

请注意: __DIR__是在PHP 5.3.0中添加的。

请使用下面的方法:

echo __DIR__;

在你的脚本上试试这个

echo getcwd() . "\n";

这是我为此写的一个有用的PHP函数。正如最初的问题所阐明的那样,它返回执行最初< em > < / em >脚本的路径——而不是我们当前所在的文件。

/**
* 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'])

对于在web服务器下运行的脚本$_SERVER['SCRIPT_FILENAME']将包含最初调用脚本的完整路径,因此可能是你的index.php。在这种情况下,realpath()不是必需的。

对于从控制台运行的脚本,$_SERVER['SCRIPT_FILENAME']将包含从当前工作目录到最初调用脚本的相对路径。因此,除非你在脚本中更改了工作目录,否则它将解析为绝对路径。

有一个简单的方法来获得最初执行的脚本的绝对路径,在该脚本而且中,任何包含includerequirerequire_once的其他脚本都是通过使用常数并将当前脚本路径存储在主脚本的开头:

define( 'SCRIPT_ROOT', __FILE__ );

上面的解决方案适用于只有一个“main”;脚本includes每一个其他需要的脚本,如在大多数可以web应用程序,工具和shell脚本。

如果不是这样,可能会有几个“初始脚本”;然后,为了避免重定义,并将正确的路径存储在常量中,每个脚本可以以以下方式开始:

if( ! defined( 'SCRIPT_ROOT' ) ) {
define( 'SCRIPT_ROOT`, __FILE__ );
}

关于(当前)< >强接受答案< / >强的说明:

答案表明最初执行的脚本路径是get_included_files()返回的数组的第一个元素。

这是一个聪明而简单的解决方案-在撰写本文时-(我们几乎在PHP 7.4.0)它做的工作

然而,通过查看< >强文档< / >强,没有提到最初执行的脚本是由get_included_files()返回的数组的第一个项。

我们只读书

最初调用的脚本被认为是“包含文件”,“包含文件”;因此它将与include和family引用的文件一起列出。

在撰写“脚本最初被称为"是数组中的第一个,但是- __abc1 -不能保证将来不会改变。


关于realpath()__FILE____DIR__的注意事项:

其他人在他们的回答中建议使用__FILE____DIR__dirname(__FILE__)realpath(__DIR__)

dirname(__FILE__)等于__DIR__(在PHP 5.3.0中引入),所以只需使用__DIR__即可。

__FILE____DIR__都是绝对路径,所以realpath()是不必要的。

正确的解决方案是使用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

这就是我所使用的,它在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']);
}