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

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

使用php_sapi_name()函数。

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

以下是文档中的一些相关说明:

php_sapi_name – 返回Web服务器和PHP之间的接口types

尽pipe并不详尽,但可能的返回值包括aolserver,apache,apache2filter,apache2handler,caudium,cgi(直到PHP 5.3),cgi-fcgi,cli,cli-server,continuity,embed,isapi,litespeed,milter,nsapi,phttpd, pi3web,roxen,thttpd,tux和webjames。

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

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

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

这使得在脚本的顶部使用起来很简单:

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

我认为

 $_SERVER['REMOTE_ADDR'] 

将不会从CLI填充。

而且,$ _SERVER超全局中的所有HTTP_ *键都不会从CLI填充,或者按正确的方式跳转:-)

这里是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'

php_sapi _name的文档页面清楚地说明了它是如何工作的:

返回描述PHP正在使用的接口(Server API,SAPI)的types的小写string….

尽pipe并不详尽,但是可能的返回值包括aolserver,apache,apache2filter,apache2handler,caudium,cgi(直到PHP 5.3),cgi-fcgi,cli,continuity,embed,isapi,litespeed,milter,nsapi,phttpd,pi3web,roxen, thttpd,tux和webjames。

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

另外,鲍比说:

我很好奇为什么文件。 例子检查前3个字符,而描述说明string应该完全是“CGI”

该示例的说明指出:

这个例子检查子stringcgi,因为它也可能是cgi-fcgi。