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

确定PHP脚本的命令行与http执行的标准方法是什么?,php,http,command-line,command-line-interface,Php,Http,Command Line,Command Line Interface,我有一个PHP脚本,需要确定它是通过命令行还是通过HTTP执行的,主要用于输出格式化。做这件事的标准方法是什么?我原以为这是为了检查服务器['argc'],但事实证明,即使在使用“Apache2.0处理程序”服务器API时,这也是填充的 $_SERVER['REMOTE_ADDR'] 不会从CLI中填充 另外,$\u SERVER superglobal中的所有HTTP_*密钥都不会从CLI填充,也不会按照刚才提到的正确方式填充:-)使用该函数 if(php\u sapi\u name()=“

我有一个PHP脚本,需要确定它是通过命令行还是通过HTTP执行的,主要用于输出格式化。做这件事的标准方法是什么?我原以为这是为了检查
服务器['argc']
,但事实证明,即使在使用“Apache2.0处理程序”服务器API时,这也是填充的

$_SERVER['REMOTE_ADDR']
不会从CLI中填充

另外,$\u SERVER superglobal中的所有HTTP_*密钥都不会从CLI填充,也不会按照刚才提到的正确方式填充:-)

使用该函数

if(php\u sapi\u name()=“cli”){
//在cli模式下
}否则{
//不在cli模式下
}
以下是文档中的一些相关注释:

php\u sapi\u name返回web服务器和php之间的接口类型

虽然并非详尽无遗,但可能的返回值包括aolserver、apache、apache2filter、apache2handler、caudium、cgi(直到PHP5.3)、cgi fcgi、cli、cli服务器、连续性、嵌入、isapi、litespeed、milter、nsapi、phttpd、pi3web、roxen、thttpd、tux和webjames


在PHP>=4.2.0中,还有一个预定义的常量,
PHP_SAPI
,它的值与
PHP_SAPI_name()

PHP_SAPI\u name的文档页面清楚地说明了它的工作原理:

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

虽然并非详尽无遗,但可能的返回值包括aolserver、apache、apache2filter、apache2handler、caudium、cgi(直到PHP5.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

这将永远有效。(如果PHP版本为4.2.0或更高版本)

这使得在脚本顶部使用起来很容易:

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

以下是Drupal 7的实现:


不过,Drupal8使用的是
PHP\u-SAPI===“cli”

谢谢。我很好奇为什么医生会这样。示例检查了前3个字符,而描述说明字符串应该是“cgi”,但除此之外,我认为这是完美的。当然,除非返回的字符串是“cgi”,这也表示正在从控制台执行php。就像在Whaddayanow中,我的例子一样。@Adriano:也许在你的例子中,php cgi是用来执行脚本的。@Bobby,php.net文档中的例子实际上通过只看字符串的前三个字符就匹配了“cgi”和“cgi fcgi”。。。这就是为什么,它实际上是有道理的。如果有什么需要说明的话,那就是@hop为严肃的程序员调用了php no language:这里有一个有趣的提示:根据实际调用的二进制文件,您可以从命令行运行php,但仍然可以得到cgi fgiAh——要么是我那天非常不注意,要么是我在发表评论后更新了示例。但是,我完全同意你关于PHP的观点;抨击变得非常累人。您的第二个代码片段看起来像一个非序列,我希望
CLI或die('not allowed')@Madbreaks,我说的是两种不同的用法。我假设一个或另一个-但是如果同时使用这两个,那么
CLI或die('not allowed')
是完美的。
使您的脚本顶部易于使用
并不会让它听起来像是两种不同的用法。是的,我是一名亡灵巫师。
<?php PHP_SAPI === 'cli' or die('not allowed');
function drupal_is_cli() {
  return (!isset($_SERVER['SERVER_SOFTWARE']) && (php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)));
}