我有一个PHP脚本,需要确定它是通过命令行还是HTTP执行的,主要是为了输出格式的目的。有没有一种标准的方法来做到这一点?我原以为可以检查SERVER['argc']
,但实际上即使使用'Apache 2.0 Handler'服务器API时也会填充该变量。
我有一个PHP脚本,需要确定它是通过命令行还是HTTP执行的,主要是为了输出格式的目的。有没有一种标准的方法来做到这一点?我原以为可以检查SERVER['argc']
,但实际上即使使用'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 之间的接口类型
虽然不是详尽无遗,但可能的返回值包括 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');
CLI or die('not allowed');
。 - MadbreaksCLI or die('not allowed');
是完美的。 - Xeoncross以下是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'
我认为
$_SERVER['REMOTE_ADDR']
从CLI中不会填充此项。
同时,$_SERVER超全局变量中所有HTTP_*键在CLI中也不会被填充,或者按照hop所提到的正确方法执行 :-)
php_sapi
_name文档页面清楚地说明了它的工作原理:
返回一个描述PHP正在使用的接口类型(服务器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服务器和接口的添加而更新该列表。
Bobby也说:
我很好奇为什么文档示例检查前3个字符,而描述则说明字符串应完全是“CGI”
示例的描述如下:
此示例检查子字符串cgi,因为它也可能是cgi-fcgi。