有没有办法区分是从命令行还是通过Web服务器调用脚本?
(请参阅What is the canonical way to determine commandline vs. http execution of a PHP script?获取最佳答案以及更详细的讨论 - 在发布之前未找到那个)
我有一个使用Apache 2.2.10和PHP 5.2.6的(非生产)服务器。在它上面,在Web可访问的目录中是我的PHP脚本maintenance_tasks.php
。我想从命令行或通过HTTP请求(通过在浏览器中打开)调用此脚本。是否有一些变量允许我可靠地确定如何调用脚本?
(我已经针对每种类型的调用和HTTP响应超时解决了不同视图的问题,只是寻找一种告诉两种调用类型的方法)
我会尝试不同的事情并在下面添加我的发现。
重复: What is the canonical way to determine commandline vs. http execution of a PHP script?
答案 0 :(得分:98)
如果从命令行调用,则不会设置服务器变量HTTP_USER_AGENT。我使用此常量来定义是否从命令行调用脚本:
define("CLI", !isset($_SERVER['HTTP_USER_AGENT']));
击> <击> 撞击>
更新:由于此答案仍然标记为“正确”,我想修改我的陈述 - 依赖“用户代理”标题可能会有问题,因为它是一个用户定义的值。
请按照评论中Eugene / cam8001的建议使用php_sapi_name() == 'cli'
或PHP_SAPI == 'cli'
。
感谢您指出这一点!
答案 1 :(得分:3)
我在两次调用中都比较了$_SERVER
超全局。似乎$_SERVER['argc']
(即传递给脚本的参数数量)仅在从shell /命令行运行时设置:
<?php
if (isset($_SERVER['argc'])) {
define('CLI', true);
} else {
define('CLI', false);
}
这似乎适用于Linux和Windows主机。 (首先我考虑检查一些环境变量,但是对于每个操作系统都是不同的。而且,CLI版本中缺少所有$_SERVER['HTTP_*']
标头,但我不确定它是否足够可靠。 )