如何区分命令行和networking服务器调用?

有没有一种方法来区分脚本是从命令行还是由Web服务器调用?

请参阅什么是确定PHP脚本的命令行与http执行的规范方式?为了获得最佳答案和更详细的讨论 – 在发布之前没有find那一个)


我有一个(非生产)服务器与Apache 2.2.10和PHP 5.2.6。 在它上面,在一个web访问的目录中是我的PHP脚本maintenance_tasks.php 。 我想从命令行或通过HTTP请求(通过在浏览器中打开)调用此脚本。 是否有一些variables可以让我可靠地确定脚本是如何被调用的?

(我已经解决了每种types的调用和HTTP响应超时的不同视图的问题,只是寻找一种方法来区分两种调用types)

我会尝试不同的事情,并在下面添加我的发现。

重复: 确定一个PHP脚本的命令行与http执行的规范方法是什么?

如果从命令行调用,则服务器variablesHTTP_USER_AGENT未设置。 我用这个常量来定义脚本是否从命令行调用:

 define("CLI", !isset($_SERVER['HTTP_USER_AGENT'])); 

更新:由于这个答案仍然被标记为“正确的”,所以我想修改我的陈述 – 依赖于“用户代理”头可能会有问题,因为它是用户定义的值。

请按照注释中的Eugene / cam8001build议使用php_sapi_name() == 'cli'PHP_SAPI == 'cli'

感谢您指出了这一点!

我比较了两个调用中的$_SERVER超全局。 看起来$_SERVER['argc'] (即传递给脚本的参数的数量)只在从shell /命令行运行时才设置:

 <?php if (isset($_SERVER['argc'])) { define('CLI', true); } else { define('CLI', false); } 

这似乎在Linux和Windows主机上都可以使用。 (首先我想过检查一些环境variables,但是每个操作系统的环境variables都不一样,而且CLI版本中缺less所有的$_SERVER['HTTP_*']头文件,但是我不确定这是不是足够可靠。)