【问题标题】:PHP passing $_GET in the Linux command promptPHP 在 Linux 命令提示符下传递 $_GET
【发布时间】:2011-05-10 08:10:07
【问题描述】:

假设我们通常通过它访问

http://localhost/index.php?a=1&b=2&c=3

我们如何在 Linux 命令提示符下执行相同的操作?

php -e index.php

但是传递 $_GET 变量呢?也许像php -e index.php --a 1 --b 2 --c 3 这样的东西?我怀疑这会奏效。

【问题讨论】:

    标签: php linux


    【解决方案1】:

    来自answer on Server Fault

    使用php-cgi 二进制而不是php,并在命令行上传递参数,如下所示:

    php-cgi -f index.php left=1058 right=1067 class=A language=English
    

    这在$_GET:

    Array
    (
        [left] => 1058
        [right] => 1067
        [class] => A
        [language] => English
    )
    

    您还可以设置将由 Web 服务器设置的环境变量,如下所示:

    REQUEST_URI='/index.php' SCRIPT_NAME='/index.php' php-cgi -f index.php left=1058 right=1067 class=A language=English
    

    【讨论】:

    • +1 和 +1:这个答案应该是公认的答案。少了很多麻烦!无需更改php源。
    • 太棒了,这可以很容易地包装在任何依赖于操作系统的脚本中。
    • +1,很棒的解决方案,我现在正在向后移植我所有的 CLI 脚本以支持它;)
    • 到目前为止我看到的唯一缺点是终端输出是带有
      的 HTML,而不仅仅是 \n。这也适用于所有通知和错误,例如<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
    • +1 太棒了,这适用于普通脚本 $_GET 值例如:php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething 效果很好..
    【解决方案2】:

    通常,为了向命令行脚本传递参数,您将使用argv 全局变量或getopt

    // Bash command:
    //   php -e myscript.php hello
    echo $argv[1]; // Prints "hello"
    
    // Bash command:
    //   php -e myscript.php -f=world
    $opts = getopt('f:');
    echo $opts['f']; // Prints "world"
    

    $_GET 指的是 HTTP GET 方法参数,这些参数在命令行中不可用,因为它们需要 Web 服务器来填充。

    如果你真的想填充$_GET,你可以这样做:

    // Bash command:
    //   export QUERY_STRING="var=value&arg=value" ; php -e myscript.php
    parse_str($_SERVER['QUERY_STRING'], $_GET);
    print_r($_GET);
    /* Outputs:
         Array(
            [var] => value
            [arg] => value
         )
    */
    

    您还可以执行给定的脚本,从命令行填充$_GET,而无需修改所述脚本:

    export QUERY_STRING="var=value&arg=value" ; \
    php -e -r 'parse_str($_SERVER["QUERY_STRING"], $_GET); include "index.php";'
    

    请注意,您也可以对 $_POST$_COOKIE 执行相同的操作。

    【讨论】:

    • 值得注意的是,在我们运行 PHP 5.3 的 Centos 6 机器上,调用 php [script name] "a=1&b=2&c=3" 不会填充 $_SERVER['QUERY_STRING'],但您可以通过引用 $_SERVER['argv'][1] 轻松影响同样的事情。跨度>
    • 尝试this answer从命令行填充查询字符串而不修改PHP脚本。
    • 这不是最佳答案。在此页面上查看其他答案:stackoverflow.com/a/11965479/543738
    • 有用的答案,不过如果你像我一样想知道getopt() 中的参数名称后面的冒号是什么,这显然告诉 PHP 你想要 argument f,不是 option f (将指定减去冒号)。所以这只是语法。
    • 我真的很喜欢最后一个答案,我昨天用过。它也可以变成脚本。
    【解决方案3】:

    有时你没有选择编辑PHP文件来设置$_GET为传入的参数,有时你不能或不想安装php-cgi。

    我发现这是该案例的最佳解决方案:

    php -r '$_GET["key"]="value"; require_once("script.php");'
    

    这可以避免更改您的 PHP 文件并让您使用普通的php 命令。如果您安装了 php-cgi,请务必使用它,但这是下一个最好的选择。我认为这个选项值得一提。

    -r 表示运行以下字符串中的 PHP 代码。您在那里手动设置 $_GET 值,然后引用您要运行的文件。

    值得注意的是,您应该在正确的文件夹中运行它,通常但并非总是在 PHP 文件所在的文件夹中。'Requires' 语句将使用命令的位置来解析相对 URL,不是 文件的位置。

    【讨论】:

    • 感谢您提供此解决方案。在我看来,这应该是公认的答案。您无需安装额外的库即可使用它。
    • 这比公认的答案要好得多。为你点赞!
    • 非常简单的解决方案!
    • 很棒的答案。您只是缺少代码中的结束引号:)
    【解决方案4】:

    我在 Ubuntu 上没有 php-cgi 二进制文件,所以我这样做了:

    % alias php-cgi="php -r '"'parse_str(implode("&", array_slice($argv, 2)), $_GET);包括($argv[1]);'"' --" % php-cgi test1.php foo=123 您将 foo 设置为 123。 %cat test1.php 您将 foo 设置为 .

    【讨论】:

      【解决方案5】:

      用途:

      php file_name.php var1 var2 varN
      

      然后在 PHP 的第一行设置您的 $_GET 变量,尽管这不是设置 $_GET 变量的理想方式,并且您可能会遇到问题,具体取决于您稍后对该变量执行的操作。

      if (isset($argv[1])) {
         $_GET['variable_name'] = $argv[1];
      }
      

      可以从 PHP 应用程序中的 $argv 数组访问用于启动脚本的变量。第一个条目将是它们来自的脚本的名称,因此如果您想处理一堆变量,您可能需要执行array_shift($argv) 删除第一个条目。或者只是加载到局部变量中。

      【讨论】:

      • 最简单的解决方案
      • 这就是解决方案! GET 根本不适用于命令行操作
      【解决方案6】:

      尝试使用WGET

      WGET 'http://localhost/index.php?a=1&b=2&c=3'
      

      【讨论】:

      • 您希望将 URL 括在单引号中,如 ?查询部分中的 & 是 shell 元字符(单个字符通配符 +“在后台运行此命令”)。
      • 这可以工作,但需要一个正在运行的 Web 服务器,并且使整个过程比所需的效率低一点。
      • 确实如此,但通常$_GET 表示正在运行的网络服务器。
      • WGET?你不是说wget吗?
      【解决方案7】:

      选项一:php-cgi

      使用 'php-cgi' 代替 'php' 来运行你的脚本。这是最简单的方法,因为您无需专门修改 PHP 代码即可使用它:

      php-cgi -f /my/script/file.php a=1 b=2 c=3
      

      选项 2:如果您有网络服务器

      如果 PHP 文件位于 Web 服务器上,您可以在命令行中使用 'wget':

      wget 'http://localhost/my/script/file.php?a=1&b=2&c=3'
      

      或者

      wget -q -O - "http://localhost/my/script/file.php?a=1&b=2&c=3"
      

      在 PHP 中访问变量

      在选项 1 和 2 中,您可以像这样访问这些参数:

      $a = $_GET["a"];
      $b = $_GET["b"];
      $c = $_GET["c"];
      

      【讨论】:

        【解决方案8】:

        如果你需要通过$_GET$_REQUEST$_POST,或者其他任何你也可以使用PHP交互模式:

        php -a
        

        然后输入:

        <?php
            $_GET['a'] = 1;
            $_POST['b'] = 2;
            include("/somefolder/some_file_path.php");
        

        这将手动设置您想要的任何变量,然后使用这些变量设置运行您的 PHP 文件。

        【讨论】:

          【解决方案9】:

          如果您有可能编辑PHP脚本,您可以在脚本开头使用以下代码人为填充$_GET数组,然后使用语法调用脚本:php -f script.php name1=value1 name2=value2

          // When invoking the script via CLI like 
          // "php -f script.php name1=value1 name2=value2", 
          // this code will populate $_GET variables called 
          // "name1" and "name2", so a script designed to 
          // be called by a web server will work even 
          // when called by CLI
          if (php_sapi_name() == "cli") {
              for ($c = 1; $c < $argc; $c++) {
                  $param = explode("=", $argv[$c], 2);
                  $_GET[$param[0]] = $param[1]; // $_GET['name1'] = 'value1'
              }
          }
          

          【讨论】:

            【解决方案10】:

            在命令行中,粘贴以下内容:

            export QUERY_STRING="param1=abc&param2=xyz" ;  
            POST_STRING="name=John&lastname=Doe" ; php -e -r 
            'parse_str($_SERVER["QUERY_STRING"], $_GET); parse_str($_SERVER["POST_STRING"], 
            $_POST);  include "index.php";'
            

            【讨论】:

              【解决方案11】:

              我只是这样传递它们:

              php5 script.php param1=blabla param2=yadayada
              

              它工作得很好。 $_GET 数组是:

              array(3) {
                ["script_php"]=>
                string(0) ""
                ["param1"]=>
                string(6) "blabla"
                ["param2"]=>
                string(8) "yadayada"
              }
              

              【讨论】:

              • 刚刚发现这在我的托管服务器上有效,但在我的本地服务器上无效,怪异。
              • 可能安装的版本有区别?哪个版本适合您,哪个版本失败了?
              • php 5.2 on hosting, works, 5.3 local doesn't...没关系我以 $argv 的方式进行操作,以防 $_GET 为空
              【解决方案12】:

              用途:

              php -r 'parse_str($argv[2],$_GET);include $argv[1];' index.php 'a=1&amp;b=2'

              您可以将第一部分设为别名:

              alias php-get='php -r '\''parse_str($argv[2],$_GET);include $argv[1];'\'

              然后简单地使用:

              php-get some_script.php 'a=1&amp;b=2&amp;c=3'

              【讨论】:

                【解决方案13】:

                或者只是(如果你有Lynx):

                lynx 'http://localhost/index.php?a=1&b=2&c=3'
                

                【讨论】:

                • 这不会从命令行运行 PHP。这将运行一个浏览器,该浏览器通过命令行调用 Web 服务器。
                猜你喜欢
                • 1970-01-01
                • 2012-07-25
                • 2020-08-18
                • 1970-01-01
                • 1970-01-01
                • 2019-11-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多