我搜索了很多内容,并获得了很多不同的解决方案和包含信息的变量来获取绝对路径。但是它们似乎在某些条件下工作,而不在其他条件下工作。有没有一种方法可以获取PHP中已执行脚本的绝对路径?对我来说,该脚本将从命令行运行,但是,如果在Apache等内部运行,则解决方案也应起作用。
说明:最初执行的脚本,不一定是解决方案的编码文件。
我搜索了很多内容,并获得了很多不同的解决方案和包含信息的变量来获取绝对路径。但是它们似乎在某些条件下工作,而不在其他条件下工作。有没有一种方法可以获取PHP中已执行脚本的绝对路径?对我来说,该脚本将从命令行运行,但是,如果在Apache等内部运行,则解决方案也应起作用。
说明:最初执行的脚本,不一定是解决方案的编码文件。
Answers:
正确的解决方案是使用以下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
__FILE__
常量将为您提供当前文件的绝对路径。
更新:
问题被更改为询问如何检索最初执行的脚本而不是当前正在运行的脚本。唯一可靠的方法是使用该debug_backtrace
功能。
$stack = debug_backtrace();
$firstFrame = $stack[count($stack) - 1];
$initialFile = $firstFrame['file'];
__FILE__
返回index.php的位置或包含的文件的位置?我如何获得index.php的位置?
__FILE__
确实点到当前脚本的路径。但是我还没有发现任何可以显示当前index.php路径的东西。
str_replace( basename(__FILE__) , '',str_replace($_SERVER["DOCUMENT_ROOT"],'',str_replace('\\','/',__FILE__ ) ) ) === /folder1/folder2/
echo realpath(dirname(__FILE__));
如果将其放置在包含文件中,它将打印此包含文件的路径。要获取父脚本的路径,请替换__FILE__
为$_SERVER['PHP_SELF']
。但是请注意,PHP_SELF存在安全风险!
__FILE__
始终包含已解析符号链接的绝对路径,而在旧版本中,在某些情况下,它包含相对路径。” 加“目录名称()天真操作输入字符串,并且不知道实际的文件系统的,或路径组分如‘..’。
PHP_SELF
??
__DIR__
从手册:
文件的目录。如果在include中使用,则返回包含文件的目录。等同于dirname(__FILE__)
。除非它是根目录,否则此目录名称不带斜杠。
__FILE__
总是包含已解析符号链接的绝对路径,而在旧版本(低于4.0.2)中,在某些情况下,它包含相对路径。
注意:__DIR__
是在PHP 5.3.0中添加的。
如果要获取当前工作目录,请使用getcwd()
http://php.net/manual/zh/function.getcwd.php
__FILE__
将返回带有文件名的路径,例如在XAMPP C:\xampp\htdocs\index.php
而不是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__;
a.php->b.php->c.php
,如果在c.php中进行了检查,则包含树应该是a.php的路径。似乎可靠的唯一方法是使用debug_backtrace()函数。
这是我为此专门编写的一个有用的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;
}
在脚本上尝试
echo getcwd() . "\n";
这就是我所使用的,并且可以在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']);
}
一种简单的方法具有的绝对路径最初执行的脚本,该脚本和包含与任何其他脚本include
,require
,require_once
是通过使用一个恒定,并在开始的存储有当前脚本路径主要脚本:
define( 'SCRIPT_ROOT', __FILE__ );
当只有一个“主”脚本可以 include
大多数Web应用程序中那样,与其他所有需要的脚本一起使用时,。
如果不是这种情况,并且可能有多个“初始脚本”,则为避免重新定义并在常量中存储正确的路径,每个脚本都可以以以下内容开头:
if( ! defined( 'SCRIPT_ROOT' ) ) {
define( 'SCRIPT_ROOT`, __FILE__ );
}
关于(当前)已接受答案的注释:
答案指出,最初执行的脚本路径是由返回的数组的第一个元素 get_included_files()
。
这是一个聪明而简单的解决方案,并且-在撰写本文时-(我们几乎在PHP 7.4.0上)可以正常工作。
但是,通过查看文档并没有提到最初执行的脚本是所返回数组的第一项get_included_files()
。
我们只看
最初调用的脚本被认为是“包含文件”,因此它将与include和family引用的文件一起列出。
在撰写本文时,“ 最初称为 ”的脚本是数组中的第一个脚本,但是-从技术上讲 -不能保证将来不会更改。
的注意事项有关realpath()
,__FILE__
和__DIR__
:
其他人在他们的答案建议使用的__FILE__
,__DIR__
,dirname(__FILE__)
,realpath(__DIR__)
...
dirname(__FILE__)
等于__DIR__
(在PHP 5.3.0中引入),因此只需使用__DIR__
。
双方__FILE__
并__DIR__
始终是绝对路径,所以realpath()
是不必要的。