我已经搜索了高和低,得到了很多不同的解决方案和变量包含信息,以获得绝对路径。但它们似乎在某些条件下有效,而在其他条件下无效。有没有一种银弹方法来获得在PHP中执行的脚本的绝对路径?对我来说,脚本将从命令行运行,但是,如果在Apache等中运行,解决方案应该也能正常运行。
澄清:最初执行的脚本,不一定是编码解决方案的文件。
我已经搜索了高和低,得到了很多不同的解决方案和变量包含信息,以获得绝对路径。但它们似乎在某些条件下有效,而在其他条件下无效。有没有一种银弹方法来获得在PHP中执行的脚本的绝对路径?对我来说,脚本将从命令行运行,但是,如果在Apache等中运行,解决方案应该也能正常运行。
澄清:最初执行的脚本,不一定是编码解决方案的文件。
当前回答
这就是我所使用的,它在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']);
}
其他回答
如果你正在寻找相对于服务器根目录的绝对路径,我发现这很有效:
$_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['SCRIPT_NAME'])
有一个简单的方法来获得初始执行脚本的绝对路径,在该脚本和包含include, require, require_once的任何其他脚本中,使用一个常量并将当前脚本路径存储在主脚本的开头:
define( 'SCRIPT_ROOT', __FILE__ );
上面的解决方案适用于当有一个单一的“主”脚本,包括所有其他需要的脚本,如在大多数web应用程序,工具和shell脚本。
如果不是这样,可能会有几个“初始脚本”,那么为了避免重新定义,并在常量中存储正确的路径,每个脚本可能以以下方式开始:
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()是不必要的。
dirname(__FILE__)
将给出当前文件的绝对路由,从您正在要求的路由,您的服务器目录的路由。
文件示例:
www / http / html / index . php;如果你把这段代码放在index.php中,它将返回:
<?php 回声目录名(__FILE__);返回:www/http/html/
www / http / html /类/ myclass.php;如果你把这段代码放在myclass.php中,它将返回:
<?php 回声目录名(__FILE__);返回:www/http/html/class/
__DIR__
摘自手册:
文件的目录。如果在包含中使用,则返回所包含文件的目录。这相当于dirname(__FILE__)。除非是根目录,否则该目录名没有后面的斜杠。
__FILE__总是包含一个符号链接解析的绝对路径,而在旧版本(高于4.0.2)中,在某些情况下它包含相对路径。
注意:__DIR__是在PHP 5.3.0中添加的。
在你的脚本上试试这个
echo getcwd() . "\n";