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

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


当前回答

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/

其他回答

echo realpath(dirname(__FILE__));

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

这是我为此写的一个有用的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;
}
realpath($_SERVER['SCRIPT_FILENAME'])

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

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

__DIR__

摘自手册:

文件的目录。如果在包含中使用,则返回所包含文件的目录。这相当于dirname(__FILE__)。除非是根目录,否则该目录名没有后面的斜杠。

__FILE__总是包含一个符号链接解析的绝对路径,而在旧版本(高于4.0.2)中,在某些情况下它包含相对路径。

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

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