获取当前脚本的绝对路径

时间:2011-01-10 09:02:04

标签: php path include

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

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

15 个答案:

答案 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__;

注意:

  • hashtag(#...)无法从PHP(服务器端)检测到URL部分。为此,请使用JavaScript。
  • DIRECTORY_SEPARATOR返回\用于Windows类型的托管,而不是/



对于WordPress

//(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();

即使出现以下情况,这也会为您提供初始脚本的绝对路径:

  • 此功能位于包含文件
  • 当前工作目录与初始脚本的目录不同
  • 脚本使用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

答案 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;检索最初执行的脚本的绝对路径的最简单方法脚本和includerequirerequire_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__ );
}