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

时间:2008-12-05 11:25:54

标签: php command-line-interface

有没有办法区分是从命令行还是通过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?

2 个答案:

答案 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_*']标头,但我不确定它是否足够可靠。 )