php 如何区分命令行调用和Web服务器调用?[duplicate]

nzkunb0c  于 2023-02-21  发布在  PHP
关注(0)|答案(2)|浏览(68)
    • 此问题在此处已有答案**:

14年前就关闭了。
是否有办法区分脚本是从命令行调用的还是由Web服务器调用的?
请参见What is the canonical way to determine commandline vs. http execution of a PHP script?以获取最佳答案和更详细的讨论-在发布之前未找到该答案)
我有一个安装了Apache 2.2.10和PHP 5.2.6的(非生产)服务器。在该服务器上,我的PHP脚本maintenance_tasks.php位于一个可通过Web访问的目录中。我想从命令行或通过HTTP请求(在浏览器中打开)调用此脚本。是否有一些变量允许我可靠地确定脚本是如何调用的?
(我已经解决了每种调用类型的不同视图和HTTP响应超时的问题,只是想找到一种区分这两种调用类型的方法)
我将尝试不同的东西,并把我的发现添加到下面。

l0oc07j2

l0oc07j21#

如果从命令行调用,则不设置服务器变量HTTP_USER_AGENT。我使用此常量来定义是否从命令行调用脚本:

define("CLI", !isset($_SERVER['HTTP_USER_AGENT']));
    • 更新:**由于这个答案仍然被标记为"正确"的答案,我想修改一下我的陈述-依赖"User-Agent"头可能会有问题,因为它是一个用户定义的值。

请按照Eugene/cam8001在评论中的建议使用php_sapi_name() == 'cli'PHP_SAPI == 'cli'
谢谢你指出这一点!

bihw5rsg

bihw5rsg2#

我比较了两次调用中的$_SERVER超全局函数,似乎$_SERVER['argc'](即传递给脚本的参数数量)仅在从shell/命令行运行时设置:

<?php
if (isset($_SERVER['argc'])) {
    define('CLI', true);
} else {
    define('CLI', false);
}

这似乎在Linux和Windows主机上都有效。(首先,我考虑检查一些环境变量,但这些变量对于每个操作系统都是不同的。此外,CLI版本中缺少所有$_SERVER['HTTP_*']标头,但我不确定这是否足够可靠。)

相关问题