繁体   English   中英

PHP 脚本检测到它是一个包含

[英]PHP script detect that it is an include

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

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

检查$ 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 如果设置了$argv[0] (脚本名称),则从命令行运行脚本。

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

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

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

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

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

我已经成功地使用if (defined('STDIN'))这样的检查。 如果脚本是从外壳运行的,则将定义STDIN ,但如果是在服务器环境中则不会定义。

正如您在此处以及Ryan在其评论中提供的链接所看到的,存在很多可能性。

if($_SERVER['SCRIPT_FILENAME']==__FILE__){
   // Directly
}else{
   // Included
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM