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


155

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

Answers:


228

使用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()


谢谢。我对为什么选择该文档很感兴趣。示例检查了前3个字符,而描述中指出字符串应恰好是“ cgi”,但除此之外,我认为这是完美的。
鲍比·杰克

除非,当然,除非返回的字符串是'cgi',这也表示正在从控制台执行php。例如,whaddayaknow,我的情况。
2009年

@Adriano:也许在您的情况下,使用php-cgi执行脚本。

3
@ Bobby,php.net文档中的示例实际上只通过查看字符串的前三个字符就可以同时匹配“ cgi”和“ cgi-fcgi”……这就是原因,这实际上很有意义。如果有的话,只是返回@hop来调用php,对于认真的程序员来说是没有语言的:D
ChrisR

1
这里有个有趣的提示:php.net/manual/en/function.php-sapi-name.php是根据所调用的实际二进制文件,您可以从命令行运行php并仍然获取cgi-fgi
DAB

22

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

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

这使得在脚本顶部易于使用:

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

8
我希望您的第二个片段看起来像是CLI or die('not allowed');
胡言乱语

1
@Madbreaks,我声明了两个单独的用途。我是假设任何一个或其他-但是如果你同时使用则CLI or die('not allowed');是完美的。
Xeoncross

感谢您的澄清,+ 1
Madbreaks

7
Which makes it easy to use at the top of your scripts听起来并不像是两个单独的用途。是的,我是个死灵法师。
乔治·迪米特里亚迪斯

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 建议使用PHP_SAPI === 'cli'



4

php_sapi_name 的文档页面清楚地说明了它的工作方式:

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

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

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

此外,鲍比说:

我对为什么选择该文档很感兴趣。该示例检查了前3个字符,而说明指出该字符串应恰好是“ CGI”

该示例的说明指出:

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


啊-那天我还是非常难以观察,或者自从我发表评论以来,示例已经更新。但是,您完全同意您对PHP的观点;扑打很累。
鲍比·杰克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.