有没有办法区分脚本是从命令行还是由网络服务器调用的?
(参见 确定 PHP 脚本的命令行与 http 执行的规范方法是什么? 最佳答案 和更详细的讨论 - 在发布之前没有找到那个)
我有一台装有 Apache 2.2.10 和 PHP 5.2.6 的(非生产)服务器。在它上面,在 Web 可访问的目录中是我的 PHP 脚本,
maintenance_tasks.php
。我想从命令行或通过 HTTP 请求(通过在浏览器中打开)调用此脚本。是否有一些变量可以让我可靠地确定脚本是如何被调用的?
(我已经解决了每种调用类型的不同视图和 HTTP 响应超时的问题,只是在寻找一种区分两种调用类型的方法)
我会尝试不同的东西并在下面添加我的发现。
如果从命令行调用,服务器变量 HTTP_USER_AGENT 未设置。我使用这个常量来定义脚本是否从命令行调用:
define("CLI", !isset($_SERVER['HTTP_USER_AGENT']));
更新: 由于这个答案仍然被标记为“正确”,我想修改我的陈述 - 依赖“User-Agent”标头可能会有问题,因为它是用户定义的值。
请按照Eugene/cam8001在评论中的建议使用
php_sapi_name() == 'cli'
或PHP_SAPI == 'cli'
。
感谢您指出这一点!
我在两次调用中比较了
$_SERVER
superglobal。似乎$_SERVER['argc']
(即传递给脚本的参数数量)仅在从 shell/命令行运行时设置:
<?php
if (isset($_SERVER['argc'])) {
define('CLI', true);
} else {
define('CLI', false);
}
这似乎在 Linux 和 Windows 主机上都有效。 (首先,我考虑检查一些环境变量,但每个操作系统的环境变量都不同。此外,CLI 版本中缺少所有
$_SERVER['HTTP_*']
标头,但我不确定这是否足够可靠。)