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

Bob*_*ack 154 php command-line http command-line-interface

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

小智 225

使用该php_sapi_name()功能.

if (php_sapi_name() == "cli") {
    // In cli-mode
} else {
    // Not in cli-mode
}
Run Code Online (Sandbox Code Playgroud)

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

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().

  • @Bobby,php.net文档中的示例实际上只通过查看字符串的前三个字符来匹配"cgi"和"cgi-fcgi"......这就是为什么它实际上是有意义的.如果有什么事情只是为了回到@hop来调用php而不是严肃的程序员语言:D (3认同)

Xeo*_*oss 22

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

define('CLI', PHP_SAPI === 'cli');
Run Code Online (Sandbox Code Playgroud)

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

<?php PHP_SAPI === 'cli' or die('not allowed');
Run Code Online (Sandbox Code Playgroud)

  • "这使得在脚本顶部使用起来很容易"并不能让它听起来像两个单独的用途.是的,我是一名死灵法师. (7认同)
  • 你的第二个片段看起来像是不合理的,我希望`CLI或死('不允许');` (6认同)

ya.*_*eck 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)));
}
Run Code Online (Sandbox Code Playgroud)

但Drupal 8 建议使用PHP_SAPI === 'cli'

  • 这也适用于运行php-cgi,太棒了! (2认同)

Vin*_*vic 8

我认为

$_SERVER['REMOTE_ADDR']
Run Code Online (Sandbox Code Playgroud)

将不会从CLI填充.

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


Ste*_*eve 5

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

返回描述 PHP 使用的接口类型(服务器 API,SAPI)的小写字符串。

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

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

另外,鲍比说:

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

该示例的描述指出:

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