2008-12-05 59 views
60

有没有方法可以区分脚本是从命令行还是由Web服务器调用?如何区分命令行和网络服务器调用?

为最佳答案和更详细的讨论,请参阅What is the canonical way to determine commandline vs. http execution of a PHP script? - 没有发现一个在发布前)


我有一个(非生产)与Apache 2.2.10和PHP 5.2服务器0.6。在它上面,在一个web访问目录中是我的PHP脚本,maintenance_tasks.php。我想从命令行或通过HTTP请求(通过在浏览器中打开)调用此脚本。是否有一些变量允许我可靠地确定脚本如何被调用?

(我已经攻克了不同意见的问题,为每种类型的调用和HTTP响应超时,只是在寻找告诉分开两种调用类型的一种方式)

我会尝试不同的东西,加我以下发现。

重复:What is the canonical way to determine commandline vs. http execution of a PHP script?

+0

哪个问题是重复的?如果重复问题与之相关,那将会很有帮助。 – starbeamrainbowlabs 2014-09-18 16:41:59

+0

@starbeamrainbowlabs:“Duplicate:http://stackoverflow.com/questions/173851/what-is-the-canonical-way-to-determine-commandline-vs-http-execution-of-a-php-s”at问题的最后部分还不够清楚? – Piskvor 2014-09-18 17:36:09

+0

由于某种原因我没有出现,谢谢你的回复:) – starbeamrainbowlabs 2014-09-19 11:24:28

回答

96

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

define("CLI", !isset($_SERVER['HTTP_USER_AGENT'])); 

UPDATE:由于这个答案仍标记为“正确”的一个,我会喜欢修改我的声明 - 依靠“User-Agent”标题可能会有问题,因为它是用户定义的值。

请使用php_sapi_name() == 'cli'PHP_SAPI == 'cli',如评论中Eugene/cam8001所建议。

感谢您指出这一点!

3

我比较了两个调用中的超全局变量$_SERVER。这似乎从壳/命令行运行时,$_SERVER['argc'](即传递给该脚本的参数个数),才设置:

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

这似乎是在Linux和Windows主机的工作两者。 (首先我想过检查一些环境变量,但是每个操作系统的环境变量都不同,并且CLI版本中缺少所有的$_SERVER['HTTP_*']头文件,但我不确定这是否足够可靠。)