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

2022-08-30 09:36:05

有没有办法区分脚本是从命令行调用的还是由 Web 服务器调用的?

(请参阅确定 PHP 脚本的命令行与 http 执行的规范方法是什么?以获取最佳答案和更详细的讨论 - 在发布之前没有找到该方法)


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

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

我将尝试不同的东西,并在下面添加我的发现。

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


答案 1

如果从命令行调用,则不会设置服务器变量HTTP_USER_AGENT。我使用此常量来定义脚本是否从命令行调用:

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

更新:由于这个答案仍然被标记为“正确”的答案,我想修改我的语句 - 依赖“User-Agent”标头可能会有问题,因为它是用户定义的值。

请按照 Eugene/cam8001 在评论中的建议使用 或 。php_sapi_name() == 'cli'PHP_SAPI == 'cli'

感谢您指出这一点!


答案 2

我已经比较了两个调用中的超全局。似乎(即传递给脚本的参数数)仅在从shell/命令行运行时设置:$_SERVER$_SERVER['argc']

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

这似乎在Linux和Windows主机上都有效。(首先,我想过检查一些环境变量,但这些变量对于每个操作系统都是不同的。此外,CLI版本中缺少所有标头,但我不确定这是否足够可靠。$_SERVER['HTTP_*']


推荐