我有一个PHP类文件,通过Web服务器和cron进程用作包含。我正在寻找一种方法来添加一些代码到脚本的头部,以便我可以检测脚本是否直接从命令行启动而不是包含在另一个脚本中。通过这种方式,我可以通过直接调用脚本并使函数实例化对象并在其上执行一些代码而无需为其创建包装脚本来使测试更容易。
我尝试使用if (php_sapi_name() == 'cli') {
,但即使脚本包含在从命令行调用的另一个脚本中,它也会测试为真。
答案 0 :(得分:3)
检查$ argv [0]是否已设置可让您知道是否从命令行调用了某些内容;它不会告诉您文件是直接调用还是包含在另一个文件中。要确定,请测试realpath($argv[0]) == realpath(__FILE__)
。
全部放在一起:
if (isset($argv[0]) && realpath($argv[0]) == realpath(__FILE__))
// This file was called directly from command line
答案 1 :(得分:2)
您可以检查是否存在$argv
。如果设置了$argv[0]
(脚本名称),则从命令行运行脚本。
答案 2 :(得分:1)
您可以测试$_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
答案 3 :(得分:0)
我已成功使用if (defined('STDIN'))
作为检查。如果脚本是从shell运行的,则将定义STDIN
,但如果它位于服务器环境中则不会定义。
正如您在此处以及Ryan在评论中提供的链接所看到的那样,有很多可能性。