60

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

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


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

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

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

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

4

2 回答 2

98

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

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

更新:由于该答案仍被标记为“正确”答案,因此我想修改我的声明-依赖“User-Agent”标头可能会出现问题,因为它是用户定义的值。

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

感谢您指出了这一点!

于 2008-12-05T11:30:05.073 回答
3

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

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

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

于 2008-12-05T11:36:16.150 回答