如何区分命令
有没有办法区分脚本是从命令行还是由Web服务器调用?
( 请参阅什么是确定PHP脚本的命令行与http执行的规范方法?以获得最佳答案和更详细的讨论 - 在发布前没有找到该方法)
我有一个(非生产)服务器与Apache 2.2.10和PHP 5.2.6。 在它上面,在一个web访问目录中是我的PHP脚本maintenance_tasks.php
。 我想从命令行或通过HTTP请求(通过在浏览器中打开)调用此脚本。 是否有一些变量允许我可靠地确定脚本如何被调用?
(我已经针对每种类型的调用和HTTP响应超时解决了不同视图的问题,只是寻找将两种调用类型分开的方式)
我会尝试不同的事情并在下面添加我的发现。
Duplicate:确定PHP脚本的命令行与http执行的规范方法是什么?
如果从命令行调用,则未设置服务器变量HTTP_USER_AGENT。 我使用这个常量来定义脚本是否从命令行调用:
define("CLI", !isset($_SERVER['HTTP_USER_AGENT']));
更新:由于这个答案仍然被标记为'正确',我想修改我的声明 - 依赖于“用户代理”标题可能有问题,因为它是用户定义的值。
请根据评论中的Eugene / cam8001建议使用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主机上运行。 (首先,我想过检查一些环境变量,但是对于每个操作系统来说都是不同的。另外,CLI版本中缺少所有$_SERVER['HTTP_*']
头文件,但我不确定这是否是足够可靠。)