【问题标题】:How to differentiate between http and cli requests?如何区分 http 和 cli 请求?
【发布时间】:2010-01-31 19:23:32
【问题描述】:

标题简单明了。我必须在服务器端知道脚本是通过 HTTP 请求还是通过命令行调用的。我可以检查$_SERVER['argv']$_SERVER['argc']
这样做的务实方法是什么?

【问题讨论】:

    标签: php http request command-line-interface


    【解决方案1】:

    http://us3.php.net/manual/en/function.php-sapi-name.php

    <?php
    echo PHP_SAPI;
    echo php_sapi_name();
    ?>
    

    【讨论】:

    • +1 这是要走的路。我在检查 $_SERVER 变量和类似的东西时遇到了问题。这个总是有效的。
    【解决方案2】:

    查看$_SERVER 中的键。如果是 cli 请求,您应该看不到任何以“HTTP”开头的内容。


    下面是一些简单的测试代码:

    <?php
    
    foreach( $_SERVER as $k=>$v ){
        echo "$k: $v\n";
    }
    
    ?>
    

    这是输出:

    aj@mmdev0:~/so$ php cli.php |grep HTTP
    aj@mmdev0:~/so$
    

    【讨论】:

    • 当您可以只测试一个值时,不需要循环。
    • @kemp,OP 的问题专门要求替代 argc
    【解决方案3】:

    可能检查是否没有设置$_SERVER['HTTP_HOST']?因为我相信该变量是通过在执行时发送到文件的请求标头填充的,而命令行可能不会发送标头。

    【讨论】:

      【解决方案4】:

      您可以检查是否设置了全局变量$argc

      【讨论】:

        【解决方案5】:

        我建议检查if(isset($_SERVER['SERVER_NAME']))

        【讨论】:

        • 我不确定这是否未设置。它可能,特别是如果您正在远程执行您的 PHP 文件..
        • 我认为 $_SERVER 数组是为 HTTP 事务保留的,但您可能是对的。仍然值得了解其中的各个成员,因为我确信它们在本地和远程执行之间存在差异。
        【解决方案6】:

        但是无论脚本是从 cli 还是从浏览器调用,您都必须通过 http (tcp) 发送数据

        【讨论】:

          猜你喜欢
          • 2014-06-28
          • 2011-06-20
          • 2013-02-08
          • 2010-09-12
          • 2020-02-20
          • 1970-01-01
          • 2020-01-08
          • 1970-01-01
          • 2020-01-25
          相关资源
          最近更新 更多