【问题标题】:PHP script detect that it is an includePHP脚本检测到它是一个包含
【发布时间】:2011-08-09 15:00:30
【问题描述】:

我有一个 PHP 类文件,它通过 Web 服务器和 cron 进程用作包含。我正在寻找一种将一些代码添加到脚本头部的方法,以便我可以检测脚本是否直接从命令行启动,而不是包含在另一个脚本中。这样,我可以通过直接调用脚本并让函数实例化对象并在其上执行一些代码来简化测试,而无需为其创建包装脚本。

我尝试使用if (php_sapi_name() == 'cli') {,但即使脚本包含在从命令行调用的另一个脚本中,测试结果也是如此。

【问题讨论】:

  • 这是重复的。请参阅stackoverflow.com/questions/2397004/… 以获得答案。有几个有效的。
  • 不,不是重复的,其他问题不同。
  • 这不是更多关于通过Apache检测(和阻止)直接访问,而不是我想做的,在命令行直接访问文件时检测并执行附加操作?跨度>
  • 完全正确。你的问题绝对不是那个问题的重复。

标签: include php


【解决方案1】:

您可以测试$_SERVER['DOCUMENT_ROOT'] 是否为空。因为它是apache预定义的变量,所以在命令行执行时为空。

有趣的是$_SERVER['DOCUMENT_ROOT'] 已定义但为空。我猜想在使用 cli 时根本不会定义它。

您还可以测试是否定义了 $argv 或其大小(使用 CLI 时至少为 1)。包含文件时我没有测试,但如果定义,sizeof($argv)肯定是 0。

其他可能的测试是$_SERVER['argc'](当由服务器执行时为 0,当从 CLI 执行时为 1)和一个奇怪的 $_SERVER['_'] 定义到 PHP 二进制文件的路径,在服务时根本没有定义。

总而言之,我将依赖$_SERVER['argc'](或$argc),它是传递给命令行的参数数量的直接计数:提供脚本时将始终为0。依赖 $argv 更复杂:您必须测试是否设置了 $argv[0]sizeof($argv) 是否 > 0。

【讨论】:

    【解决方案2】:

    您可以检查$argv 的存在。如果设置了$argv[0](脚本名称),您的脚本将从命令行运行。

    【讨论】:

    • 如果脚本包含在从命令行调用的另一个脚本中,这是否仍然测试为真?虽然我可以检查 $argv[0] 的值是否已设置...嗯...
    • @Wige 这是一个全局变量,所以如果你的脚本是从另一个从命令行运行的脚本调用的,它仍然存在。
    • 这看起来是迄今为止最接近的解决方案。目前似乎有效的是if (isset($argv[0]) && strpos($argv[0], 'file.class.php') > 0) { 这种方法似乎是始终检测文件是否直接从命令行调用的最佳方法。
    • @Wige 是的,如果包含它的脚本也可以从命令行运行,您将不得不添加第二个。
    【解决方案3】:

    我已成功使用if (defined('STDIN')) 作为这样的检查。 STDIN 将在脚本从 shell 运行时被定义,但如果它在服务器环境中则不会。

    正如您在此处和 Ryan 在评论中提供的链接中看到的那样,有很多可能性。

    【讨论】:

      【解决方案4】:

      检查是否设置了 $argv[0] 可以让您知道是否从命令行调用了某些内容;它不会告诉您该文件是直接调用的还是从另一个文件中包含的。要确定这一点,请测试 realpath($argv[0]) == realpath(__FILE__)

      把它们放在一起:

      if (isset($argv[0]) && realpath($argv[0]) == realpath(__FILE__))
          // This file was called directly from command line
      

      【讨论】:

      • 这才是真正的答案。 $argv[0] 将在通过 cli 调用的文件和该脚本将包含的脚本上设置。但是在所有脚本上,$argv[0] 将设置为相同的文件名,即直接调用的文件名。 __FILE__ != $argv[0] 包含/必需的脚本。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2011-02-09
      相关资源
      最近更新 更多