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

时间:2008-10-06 10:51:04

标签: php http command-line command-line-interface

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

5 个答案:

答案 0 :(得分:217)

使用php_sapi_name()功能。

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

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

  

php_sapi_name - 返回Web服务器和PHP之间的接口类型

     

虽然不是详尽无遗,但可能的返回值包括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()相同。

答案 1 :(得分:21)

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

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

这使您可以轻松地在脚本的顶部使用:

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

答案 2 :(得分:9)

这是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 recommends使用PHP_SAPI === 'cli'

答案 3 :(得分:8)

我认为

$_SERVER['REMOTE_ADDR']

将不会从CLI填充。

此外,$ _SERVER超全局中的所有HTTP_ *键都不会从CLI填充,或者以刚才提到的正确方式执行: - )

答案 4 :(得分:4)

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

  

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

     

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

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

另外,鲍比说:

  

我很感兴趣为什么这个文件。示例检查前3个字符,而描述说明字符串应该是“CGI”

示例说明:

  

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