PHP如何获取当前执行脚本的路径_PHP获取脚本文件路径常量详解

要获取当前脚本路径,首选__DIR__和__FILE__,它们提供文件自身及所在目录的绝对路径,不受环境影响;而$_SERVER[‘SCRIPT_FILENAME’]返回主入口脚本路径,在包含文件中与__FILE__不同;$_SERVER[‘PHP_SELF’]为URL路径,存在XSS风险需转义;getcwd()返回当前工作目录,行为受执行环境影响。在Web与CLI环境下,各方法表现不一,推荐使用__DIR__构建相对路径,确保可移植性与安全性。

php如何获取当前执行脚本的路径_php获取脚本文件路径常量详解

在PHP中,要获取当前执行脚本的路径,最直接也最常用的方法是利用PHP的魔术常量

__FILE__
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

__DIR__
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

。它们能精准地告诉你当前文件自身的绝对路径或所在目录。此外,

$_SERVER
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

超全局变量也提供了多种获取路径的途径,比如

$_SERVER['SCRIPT_FILENAME']
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

能给出主入口脚本的绝对路径,而

$_SERVER['PHP_SELF']
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

则提供了相对于Web服务器根目录的URL路径。选择哪种方法,往往取决于你具体想获取“哪个”路径,以及在什么场景下使用。

解决方案

当我们需要在PHP中获取当前脚本的路径时,有几个核心的工具可以利用。每种都有其独特的行为和适用场景,理解这些差异是关键。

1.

__FILE__
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

:当前文件的完整路径
这个魔术常量会返回当前执行文件的完整路径和文件名。比如,如果你的文件在

/var/www/html/project/src/helper.php
登录后复制
登录后复制

,那么在

helper.php
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

中使用

__FILE__
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

就会得到这个字符串。它是一个绝对路径。

2.

__DIR__
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

:当前文件所在的目录
这是PHP 5.3引入的,它等同于

dirname(__FILE__)
登录后复制
登录后复制
登录后复制

。它会返回当前文件所在的目录的绝对路径,不包含文件名。这在我看来,比每次都写

dirname(__FILE__)
登录后复制
登录后复制
登录后复制

要简洁得多,也更直观。如果

__FILE__
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

/var/www/html/project/src/helper.php
登录后复制
登录后复制

,那么

__DIR__
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

就是

/var/www/html/project/src
登录后复制

。我个人在开发中,遇到需要定位当前文件所在的目录时,几乎是条件反射般地会用到

__DIR__
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

3.

$_SERVER['SCRIPT_FILENAME']
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

:入口脚本的完整路径
这个变量通常会给出Web服务器执行的主入口脚本的绝对路径。注意,这里是“主入口脚本”,这意味着如果你有一个

index.php
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

文件,它

include
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

require
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

helper.php
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

,那么在

helper.php
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

中,

__FILE__
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

会是

helper.php
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

的路径,而

$_SERVER['SCRIPT_FILENAME']
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

仍然会是

index.php
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

的路径。这是一个重要的区别,经常会让人混淆。在CLI(命令行接口)模式下,它通常就是你执行的那个脚本的路径。

4.

$_SERVER['PHP_SELF']
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

:相对于Web根目录的脚本路径(URL路径)
这个变量提供的是当前正在执行脚本的URL路径,相对于Web服务器的文档根目录。例如,如果你的网站根目录是

/var/www/html
登录后复制
登录后复制

,脚本路径是

/var/www/html/project/index.php
登录后复制

,那么

$_SERVER['PHP_SELF']
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

可能会是

/project/index.php
登录后复制

。这个值在构建URL时很有用,但需要特别小心,因为它没有经过HTML实体编码,直接输出到页面可能会导致XSS漏洞。

5.

getcwd()
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

:当前工作目录
这个函数返回的是PHP当前的工作目录。在Web环境中,它通常是Web服务器的文档根目录(或脚本所在的目录,取决于服务器配置和脚本的执行方式)。在CLI环境中,它就是你执行PHP命令时所在的目录。它的行为比较动态,会随着

chdir()
登录后复制
登录后复制

函数调用而改变,所以在使用时需要明确你期望的“当前工作目录”是什么。我发现很多人会把它和脚本路径混淆,但它们是两个概念。

PHP中

__FILE__
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

__DIR__
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

的本质区别及应用场景是什么?

__FILE__
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

__DIR__
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

这两个魔术常量,在PHP中定位文件和目录时扮演着核心角色,但它们的侧重点和行为逻辑有着本质的不同,理解这些差异对于构建健壮的应用程序至关重要。

本质区别:

立即学习PHP免费学习笔记(深入)”;

  • __FILE__
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    :指向“文件本身”的绝对路径。 它会返回包含文件名在内的完整路径。无论这个文件是在哪里被

    include
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    require
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    的,

    __FILE__
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    始终代表它自身被定义时的那个文件的路径。举个例子,如果你的

    config.php
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    文件位于

    /var/www/app/config/config.php
    登录后复制
    登录后复制

    ,并在

    /var/www/app/index.php
    登录后复制

    中被

    require
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    ,那么在

    config.php
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    内部使用

    __FILE__
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    ,得到的结果仍然是

    /var/www/app/config/config.php
    登录后复制
    登录后复制

  • __DIR__
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    :指向“文件所在目录”的绝对路径。 这是

    dirname(__FILE__)
    登录后复制
    登录后复制
    登录后复制

    的语法糖,它返回的是

    __FILE__
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    所指向文件所在的目录,不包含文件名。同样,它的行为是词法作用域的,即它总是指向定义它的文件所在的目录,不受其被包含或执行位置的影响。这在构建相对路径时极为方便。

应用场景:

  1. 定位资源文件: 当你需要从当前脚本所在的目录加载其他资源(如模板文件、配置文件、图片等)时,

    __DIR__
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    是首选。

    // 在 /project/src/Utils.php 中
    $templatePath = __DIR__ . '/../templates/layout.html';
    // 这样无论Utils.php在哪里被调用,它总能找到相对于自身目录的模板
    登录后复制

    我个人觉得,这种方式构建路径非常稳健,因为它不依赖于当前工作目录,也不受入口脚本位置的影响。

  2. 自动加载器: 在实现PSR-4或PSR-0自动加载器时,

    __DIR__
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    常用于构建类文件的绝对路径。加载器需要知道类文件相对于其定义位置的路径。

    // 在 /project/vendor/autoload.php 中
    spl_autoload_register(function ($class) {
        $file = __DIR__ . '/../src/' . str_replace('/', '/', $class) . '.php';
        if (file_exists($file)) {
            require $file;
        }
    });
    登录后复制
  3. 日志记录或调试: 在日志或调试输出中,记录

    __FILE__
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    可以帮助你快速定位到是哪个文件触发了特定的事件或错误。

  4. 计算项目根目录: 很多框架或库会利用

    __DIR__
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    来推断项目的根目录。例如,如果入口文件在

    项目根目录/public/index.php
    登录后复制

    ,那么在

    index.php
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    中,

    __DIR__ . '/..'
    登录后复制

    就指向了项目根目录。这种方式比依赖

    getcwd()
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    $_SERVER
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    更可靠,尤其是在被包含文件或CLI环境下。

简而言之,当你需要一个“硬编码”的、始终指向文件自身或其所在目录的绝对路径时,

__FILE__
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

__DIR__
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

是你的不二之选。它们提供了最高的确定性,不受外部环境(如Web服务器配置、当前工作目录)的干扰。

理解

$_SERVER
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

超全局变量:获取脚本路径的多种姿势与潜在陷阱

$_SERVER
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

是一个包含诸如头信息、路径和脚本位置等服务器和执行环境信息的超全局变量。它提供了多种获取脚本路径的姿势,但与此同时,也伴随着一些需要警惕的潜在陷阱。

获取脚本路径的多种姿势:

  1. $_SERVER['SCRIPT_FILENAME']
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    如前所述,这通常是当前执行的主入口脚本的绝对路径。在Web服务器环境下,它指向被请求的

    .php
    登录后复制

    文件的完整文件系统路径。在CLI环境下,它就是你命令行中指定的那个脚本的路径。

    • 优点: 提供了绝对路径,通常是可靠的。
    • 缺点: 在被

      include
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制

      require
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制

      的文件中,它依然指向主入口脚本,而不是当前被包含的文件。这与

      __FILE__
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制

      的行为是相反的。

  2. $_SERVER['PHP_SELF']
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    这个变量包含当前执行脚本的路径,相对于Web服务器的文档根目录。它是一个URL路径,不包含协议、域名和查询字符串。

    • 优点: 适用于在HTML中生成指向当前脚本的链接,或者在表单的

      action
      登录后复制

      属性中使用。

    • 缺点: 严重的安全隐患! 如果脚本路径中包含用户输入(尽管这种情况不常见),或者攻击者能够操纵URL,直接将

      $_SERVER['PHP_SELF']
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制

      输出到HTML页面而不进行适当的清理(如

      htmlspecialchars()
      登录后复制
      登录后复制
      登录后复制

      ),就可能导致XSS(跨站脚本攻击)。攻击者可以在URL中注入恶意JavaScript代码,然后当其他用户访问这个URL时,恶意代码就会执行。我个人对这个变量的使用一直持谨慎态度,能不用则不用,非用不可也必须经过严格的过滤。

  3. $_SERVER['REQUEST_URI']
    登录后复制
    登录后复制
    登录后复制

    包含访问当前页面所使用的URI。这通常是完整的URL路径(包括查询字符串,但不包括域名和协议)。

    • 优点: 提供了完整的请求URI,对于路由、日志记录和重定向等场景非常有用。
    • 缺点: 它不是一个文件系统路径,不能直接用于文件操作。而且,它同样可能包含用户输入,需要进行清理以防止XSS。
  4. $_SERVER['DOCUMENT_ROOT']
    登录后复制
    登录后复制

    这是Web服务器的文档根目录的绝对路径。结合其他路径信息,可以构建出文件的绝对路径。

    HIX Translate

    HIX Translate

    由 ChatGPT 提供支持的智能AI翻译器

    HIX Translate70


    查看详情
    HIX Translate

    • 优点: 提供了一个固定的基准路径,有助于在整个应用中定位相对于Web根目录的文件。
    • 缺点: 依赖于服务器配置,在某些特殊配置下可能不准确。在CLI环境下通常不存在或为空。

潜在陷阱与注意事项:

  • 安全性:

    $_SERVER['PHP_SELF']
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    $_SERVER['REQUEST_URI']
    登录后复制
    登录后复制
    登录后复制

    都可能被用户输入污染。永远不要直接将它们输出到HTML页面,务必使用

    htmlspecialchars()
    登录后复制
    登录后复制
    登录后复制

    或其他过滤函数进行转义。 这是一个非常基础但又极其重要的安全原则。

  • 一致性: 在不同的Web服务器(Apache, Nginx, IIS)和不同的PHP运行模式(mod_php, FPM, CGI)下,

    $_SERVER
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    数组中的某些键可能存在细微的差异或缺失。虽然

    SCRIPT_FILENAME
    登录后复制
    登录后复制

    PHP_SELF
    登录后复制
    登录后复制

    通常比较稳定,但如果你的应用需要在多种环境下运行,最好进行测试验证。

  • CLI与Web环境: 在CLI环境下,

    $_SERVER
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    数组会大大简化,许多与Web请求相关的键(如

    HTTP_HOST
    登录后复制

    ,

    REQUEST_URI
    登录后复制

    ,

    DOCUMENT_ROOT
    登录后复制
    登录后复制

    ,

    PHP_SELF
    登录后复制
    登录后复制

    等)可能不存在或为空。因此,依赖这些变量的代码在CLI下可能会报错或行为异常。

  • 符号链接: 如果你的脚本是通过符号链接访问的,

    $_SERVER['SCRIPT_FILENAME']
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    可能会返回符号链接的路径,而不是实际文件的路径。这在某些情况下可能会导致问题,而

    __FILE__
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    通常会解析到实际文件的路径。

总的来说,

$_SERVER
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

提供了丰富的信息,但使用时需要更细致的判断和处理。对于获取文件系统路径,我更倾向于

__FILE__
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

__DIR__
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

的确定性;而

$_SERVER
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

更多地用于处理请求相关的URL信息,并且始终要牢记安全过滤。

在不同执行环境下,PHP脚本路径获取方法的行为差异与最佳实践

PHP脚本的执行环境多种多样,从常见的Web服务器(Apache、Nginx)到命令行接口(CLI),再到通过

include
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

require
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

引入的子脚本,每种环境都会对获取脚本路径的方法产生不同的影响。理解这些差异,是选择最佳实践的关键。

1. Web服务器环境(Apache/Nginx + FPM/mod_php):

  • __FILE__
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    __DIR__
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    始终指向它们自身被定义的文件或目录的绝对路径。这是它们最稳定和可靠的特性。无论文件是入口脚本还是被包含的辅助脚本,它们的值都不会变。

  • $_SERVER['SCRIPT_FILENAME']
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    指向请求的URL对应的PHP主入口脚本的绝对路径。如果

    index.php
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    包含了

    helper.php
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    ,那么在

    helper.php
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    中,

    SCRIPT_FILENAME
    登录后复制
    登录后复制

    仍然是

    index.php
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    的路径。

  • $_SERVER['PHP_SELF']
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    提供请求的URL路径,相对于Web根目录。例如

    /my_app/index.php
    登录后复制

  • getcwd()
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    通常返回Web服务器的文档根目录(如

    /var/www/html
    登录后复制
    登录后复制

    ),或者在某些配置下是入口脚本所在的目录。它的行为可能受服务器配置和脚本内部

    chdir()
    登录后复制
    登录后复制

    调用的影响。

2. 命令行接口(CLI)环境:

  • __FILE__
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    __DIR__
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    行为与Web环境一致,指向它们自身被定义的文件或目录的绝对路径。

  • $_SERVER['SCRIPT_FILENAME']
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    指向你在命令行中直接执行的那个PHP脚本的绝对路径。

  • $_SERVER['PHP_SELF']
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    通常不存在或为空。因为没有Web请求,所以这个概念也就不适用。

  • getcwd()
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    返回你执行PHP命令时所在的目录。如果你在

    /home/user
    登录后复制
    登录后复制

    目录下执行

    php /var/www/script.php
    登录后复制

    ,那么

    getcwd()
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    将返回

    /home/user
    登录后复制
    登录后复制

    。如果你执行

    cd /var/www && php script.php
    登录后复制

    ,那么

    getcwd()
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    将返回

    /var/www
    登录后复制

3.

include
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

/

require
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

引入的子脚本:

这是最容易产生混淆的地方。

  • __FILE__
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    __DIR__
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    这是重点! 它们总是指向当前正在被解析的那个文件本身的路径。如果

    index.php
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    (位于

    /var/www/html/
    登录后复制

    require
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    config.php
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    (位于

    /var/www/html/config/
    登录后复制

    ),那么在

    config.php
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    内部:

    • __FILE__
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制

      /var/www/html/config/config.php
      登录后复制
    • __DIR__
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制
      登录后复制

      /var/www/html/config
      登录后复制
  • $_SERVER['SCRIPT_FILENAME']
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    始终指向最初被请求的入口脚本的路径。在上述例子中,即使在

    config.php
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    内部,

    $_SERVER['SCRIPT_FILENAME']
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    仍然是

    /var/www/html/index.php
    登录后复制

最佳实践:

  1. 获取当前文件所在目录: 毫无疑问,使用

    __DIR__
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    。它最直接、最可靠,不受包含关系和执行环境的影响。

    // 在任何文件中,获取该文件所在的目录
    $currentDir = __DIR__;
    登录后复制
  2. 获取项目根目录: 这是一个常见需求。通常,我们会将入口文件(如

    public/index.php
    登录后复制

    )放置在项目根目录的子目录下。

    // 如果入口文件在 /project_root/public/index.php
    // 在 index.php 中获取项目根目录
    define('PROJECT_ROOT', __DIR__ . '/..');
    // 在其他被包含的文件中,如果需要项目根目录,直接使用 PROJECT_ROOT
    登录后复制

    这种方式比依赖

    getcwd()
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    $_SERVER['DOCUMENT_ROOT']
    登录后复制
    登录后复制

    更具可移植性和稳定性,因为

    __DIR__
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    是词法作用域的,而

    getcwd()
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    会变,

    DOCUMENT_ROOT
    登录后复制
    登录后复制

    在CLI下不存在。

  3. 构建相对于当前文件的路径: 同样使用

    __DIR__
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    // 在 /src/Utils.php 中需要加载 /src/data/config.json
    $configPath = __DIR__ . '/data/config.json';
    登录后复制
  4. 处理URL路径: 如果需要获取URL路径来生成链接或进行路由,使用

    $_SERVER['REQUEST_URI']
    登录后复制
    登录后复制
    登录后复制

    $_SERVER['PHP_SELF']
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    ,但务必进行安全过滤(

    htmlspecialchars()
    登录后复制
    登录后复制
    登录后复制

    $safeSelf = htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'UTF-8');
    // <form action="<?php echo $safeSelf; ?>" method="post">
    登录后复制
  5. 区分CLI和Web环境: 如果你的脚本需要在两种环境下运行,并且行为依赖于环境,可以使用

    php_sapi_name()
    登录后复制

    来判断。

    if (php_sapi_name() === 'cli') {
        // CLI specific logic
        $scriptPath = $_SERVER['SCRIPT_FILENAME']; // 在CLI下通常可靠
    } else {
        // Web specific logic
        $scriptPath = $_SERVER['SCRIPT_FILENAME']; // Web入口脚本路径
    }
    登录后复制

总之,对于文件系统路径的获取,

__DIR__
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

__FILE__
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

提供了最稳定和可预测的行为,我建议优先使用它们。

$_SERVER
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

变量虽然功能强大,但其行为在不同环境下可能存在差异,且部分变量有安全隐患,使用时需格外小心和审慎。

以上就是PHP如何获取当前执行脚本的路径_PHP获取脚本文件路径常量详解的详细内容,更多请关注php中文网其它相关文章!

https://www.php.cn/faq/1516736.html

发表回复

Your email address will not be published. Required fields are marked *