【问题标题】:PHP - command line arguments in WindowsPHP - Windows 中的命令行参数
【发布时间】:2010-09-09 01:46:30
【问题描述】:

我正在尝试从Windows XP 下的命令行运行 PHP。

这行得通,但我无法为我的 PHP 脚本提供参数。

我的测试用例:

echo "param = " . $param . "\n";
var_dump($argv);

我想这样称呼它:

php.exe -f test.php -- param=test

但我从来没有让脚本接受我的参数。

我从上面的脚本得到的结果:

PHP 注意:未定义变量:第 2 行 C:\test.php 中的参数

param = ''
array(2) {
  [0]=> string(8) "test.php"
  [1]=> string(10) "param=test"
}

我正在尝试使用 PHP 5.2.6。这是 PHP 5 中的错误吗?

参数传递在online help中处理:

注意:如果您需要将参数传递给脚本,则需要在使用 -f 开关时将 -- 作为第一个参数传递。

这似乎在 PHP 4 下工作,但在 PHP 5 下却不行。

在 PHP 4 下,我可以使用可以在服务器上运行的相同脚本,而无需在命令行上进行更改。这对于本地调试很方便,例如,将输出保存在文件中,以供研究。

【问题讨论】:

    标签: php command-line parameters


    【解决方案1】:

    命令行示例:

        php myserver.php host=192.168.1.4 port=9000
    

    在文件 myserver.php 中,使用以下行:

    <?php
        parse_str(implode('&', array_slice($argv, 1)), $_GET);
        // Read arguments
    
        if (array_key_exists('host', $_GET))
        {
            $host = $_GET['host'];
        }
    
        if (array_key_exists('port', $_GET))
        {
            $port = $_GET['port'];
        }
    ?>
    

    【讨论】:

      【解决方案2】:

      如果你想传递类似于GET变量的参数,那么你可以使用parse_str()函数。类似的东西:

      <?php
          parse_str($argv[1]);
      ?>
      

      将产生一个变量,$test,其值为

      【讨论】:

        【解决方案3】:

        您可以使用getopt() 函数。

        查看博文PHP CLI script and Command line arguments

        【讨论】:

        【解决方案4】:

        你可以使用类似的东西

        if (isset($argv[1]) {
          $arg1 = $argv[1];
          $arg1 = explode("=", $arg1);
          $param = $arg1[1];
        }
        

        (如何处理缺少参数取决于您。)

        或者,如果您需要更复杂的场景,请查看命令行解析器库,例如来自 Pear 的解析器库。

        使用在另一个解决方案中发布的${$parts[0]} = $parts[1]; 可以覆盖代码中的任何变量,这听起来并不安全

        【讨论】:

          【解决方案5】:

          您可以使用 $argv 数组。像这样:

          <?php
              echo $argv[1];
          ?>
          

          请记住,$argv 数组的第一个成员(即 $argv[0])是脚本本身的名称,因此为了使用应用程序的参数,您应该从第 '1' 个索引开始使用 $argv[] 的成员。

          调用应用程序时,使用以下语法:

          php myscript.php -- myValue
          

          没有必要为参数命名。如您所见,您在 $argv[] 上称为 var_dump(),第二个成员(即第一个参数)是字符串 PARAM=测试。正确的?所以没有必要为参数命名。只需输入 param 值。

          【讨论】:

          • print_r($argv) 对于阵列故障排除更有用,恕我直言。
          【解决方案6】:

          参数传递在在线帮助中处理 注意:如果您需要将参数传递给您的脚本,您需要在使用 -f 开关时传递 -- 作为第一个参数。这似乎在 PHP 4 下有效,但在 PHP 5 下无效。

          但是 PHP 仍然不解析这些参数。它只是将它们传递给 $argv 数组中的脚本。

          -- 的唯一原因是 PHP 可以判断哪些参数适用于 PHP 可执行文件,哪些参数适用于您的脚本。

          这可以让你做这样的事情:

          php -e -n -f myScript.php -- -f -n -e
          

          (-f、-n 和 -e 选项之后 -- 被传递给文件 myScript.php。之前的那些被传递给 PHP 本身)。

          【讨论】:

            【解决方案7】:

            PHP 不会为您参数化命令行参数。查看ARGV 中的第二个条目是“param=test”的输出。

            您很可能希望使用 PEAR 包 Console_CommandLine:“功能齐全的命令行选项和参数解析器”。

            或者您可以自虐并添加代码以通过您的ARGV 并自己设置参数。这是一个非常简单的 sn-p 帮助您入门(如果第一部分不是有效的变量名或 ARGV 部分中有多个 '=',则此方法将不起作用:

            foreach($argv as $v) {
                if(false !== strpos($v, '=')) {
                    $parts = explode('=', $v);
                    ${$parts[0]} = $parts[1];
                }
            }
            

            【讨论】:

              【解决方案8】:

              您为什么期望 param 将被设置为该值?

              您负责以您想要的方式从 $argv 数组中解析命令行。

              【讨论】:

                【解决方案9】:

                如果您喜欢生活在最前沿,PHP 5.3 有 getOpt() 命令,它将为您处理所有这些杂乱无章的事情。有点。

                【讨论】:

                  【解决方案10】:

                  你可以这样做:

                  if($argc > 1){
                      if($argv[1] == 'param=test'){
                          $param = 'test';
                      }
                  }
                  

                  当然,您可以根据需要变得复杂得多。

                  【讨论】:

                    【解决方案11】:

                    $argv 是一个包含所有命令行参数的数组...您需要解析该数组并自己设置 $param。

                    $tmp = $argv[1];             // $tmp="param=test"
                    $tmp = explode("=", $tmp);   // $tmp=Array( 0 => param, 1 => test)
                    
                    $param = $tmp[1];            // $param = "test";
                    

                    【讨论】:

                      猜你喜欢
                      • 2014-07-12
                      • 2011-03-03
                      • 2012-04-10
                      • 1970-01-01
                      • 2012-05-12
                      • 2021-07-07
                      • 1970-01-01
                      • 2013-07-23
                      • 1970-01-01
                      相关资源
                      最近更新 更多