在 PHP 中,如何检测执行是从 CLI 模式还是通过浏览器? [复制]
Posted
技术标签:
【中文标题】在 PHP 中,如何检测执行是从 CLI 模式还是通过浏览器? [复制]【英文标题】:In PHP, how to detect the execution is from CLI mode or through browser ? [duplicate] 【发布时间】:2010-12-31 18:31:12 【问题描述】:我有一个通用脚本,它包含在我的 phpcron 文件和通过浏览器访问的文件中。代码的某些部分,我只需要非 cron 文件。我如何检测执行是来自 CLI 还是通过浏览器(我知道可以通过使用 cron 文件传递一些参数来完成,但我无权访问 crontab)。有没有其他办法?
【问题讨论】:
【参考方案1】:使用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。
【讨论】:
+1 是唯一正确的方法。 PHP_SAPI 也可以用于此,因此它并不是唯一正确的方法 这曾经是一个仅链接的答案,直到有人复制了@Linus Unnebäck 的答案。坏习惯!否决这个,赞成另一个...... @GottliebNotschnabel 谢谢!看到这种情况很烦人。 捏别人的帮助,啧啧啧。真的不是很厉害,伙计。【参考方案2】:if(php_sapi_name() == "cli")
//In cli-mode
else
//Not in cli-mode
【讨论】:
【参考方案3】:有一个常量PHP_SAPI
与php_sapi_name()
具有相同的值。
(在 PHP >= 4.2.0 中可用)
【讨论】:
这是最好的办法!【参考方案4】:我认为您可以从 $_SERVER 变量中看到它。尝试打印出浏览器和 CLI 的 $_SERVER 数组,您应该会看到差异。
【讨论】:
这可能是真的,但可能不是确定正在使用的接口的可靠方法。检查的正确方法是使用php_sapi_name()
。【参考方案5】:
你可以使用:
if (isset($argc))
// CLI
else
// NOT CLI
【讨论】:
-1 -$argc
可以在应用程序中设置,不是吗?不是可靠的方法。一次花了我半天的时间。 php_sapi_name()
是我知道的唯一好方法。
$argv / $argc 也可以在某些配置中填充 GET 变量!
$argc 可以在设置中禁用(未注册),即使是控制台应用程序以上是关于在 PHP 中,如何检测执行是从 CLI 模式还是通过浏览器? [复制]的主要内容,如果未能解决你的问题,请参考以下文章