确定 PHP 脚本的命令行和 http 执行的规范方法是什么?

我有一个 PHP 脚本,它需要确定是通过命令行执行还是通过 HTTP 执行,主要是为了输出格式化的目的。这样做的规范方式是什么?我原以为它是用来检查 SERVER['argc']的,但实际上它是填充的,即使在使用“ Apache 2.0 Handler”服务器 API 时也是如此。

44353 次浏览

我觉得

$_SERVER['REMOTE_ADDR']

将不会从 CLI 中填充。

此外,$_ SERVER superglobal 中的所有 HTTP _ * 键不会从 CLI 中填充,或者按照刚才提到的跳转方式进行填充: -)

使用 php_sapi_name()函数。

if (php_sapi_name() == "cli") {
// In cli-mode
} else {
// Not in cli-mode
}

以下是一些文件中的相关注释:

返回 web 服务器和 PHP 之间的接口类型

虽然不是详尽的,但可能的返回值包括 aolserver,apache,apache2filter,apache2handler,caudum,cgi (直到 PHP 5.3) ,cgi-fcgi,cli,cli-server,连续性,embed,isapi,litespeed,milter,nsapi,phttpd,pi3web,roxen,thttpd,tux 和 webjames。

在 PHP > = 4.2.0中,还有一个预定义的常量 PHP_SAPI,它的值与 php_sapi_name()相同。

php_sapi _ name 的文档页面清楚地说明了它的工作原理:

返回一个小写字符串,该字符串描述 PHP 正在使用的接口类型(Server API、 SAPI) ..。

虽然不是详尽的,但可能的返回值包括 aolserver,apache,apache2filter,apache2handler,caudum,cgi (直到 PHP 5.3) ,cgi-fcgi,cli,连续性,嵌入,isapi,litespeed,milter,nsapi,phttpd,pi3web,roxen,thttpd,tux 和 webjames。

我不知道为什么 Hop 不认为 PHP 适合严肃的程序员(我是一个严肃的程序员,我每天使用 PHP) ,但如果他想帮助澄清文档,那么也许他可以审计所有可能的网络服务器,PHP 可以运行,并确定每个服务器的所有可能的接口类型的名称。只要确保在添加新的 Web 服务器和接口时更新该列表即可。

还有,鲍比说:

我很好奇为什么医生。示例检查前3个字符,而描述指出字符串应该正好是“ CGI”

该示例的说明指出:

此示例检查子字符串 cgi,因为它也可能是 cgi-fcgi。

这将始终工作。(如果 PHP 版本是4.2.0或更高)

define('CLI', PHP_SAPI === 'cli');

这使得它很容易在脚本的顶部使用:

<?php PHP_SAPI === 'cli' or die('not allowed');

下面是 Drupal 7的实现: Drupal _ is _ cli ():

function drupal_is_cli() {
return (!isset($_SERVER['SERVER_SOFTWARE']) && (php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)));
}

然而 Drupal 8 建议使用 PHP_SAPI === 'cli'