如何区分命令行和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_*']
头文件,但是我不确定这是不是足够可靠。)