PHP - 在Windows中使用命令行参数

7

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

尽管可以运行,但是我无法向PHP脚本提供参数。

我的测试案例:

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

我想称之为:

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

但我从未成功让脚本接受我的参数。

上面的脚本运行结果是:

PHP提示:C:\test.php第2行未定义变量:param

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

我正在尝试使用PHP 5.2.6。这是PHP 5的一个bug吗?
参数传递在在线帮助中有详细说明:
注意:如果您需要向脚本传递参数,您需要在使用-f开关时将--作为第一个参数传递。
这在PHP 4下似乎可以工作,但在PHP 5下不行。
在PHP 4下,我可以使用相同的脚本,在服务器上运行而无需更改就能在命令行上运行。这对于本地调试非常方便,例如将输出保存到文件中以供研究。
11个回答

7

你为什么期望param会被设置为某个值呢?

你需要按照自己的方式从$argv数组中解析命令行。


4

2
根据这个网站:http://www.tuxradar.com/practicalphp/21/2/4 getopt() 在Windows上不起作用(OP正在使用Windows)。 - Robert Penridge

3
如果您想传递类似于GET变量的参数,可以使用parse_str()函数。示例代码如下:
<?php
    parse_str($argv[1]);
?>

会产生一个变量,$test,其值为<myValue>。


3
参数传递在在线帮助中有说明:如果需要向脚本传递参数,使用-f开关时需要将--作为第一个参数传递。这在PHP 4下似乎有效,但在PHP 5下无效。但是,PHP仍然不解析这些参数,它只是将它们传递给脚本的$argv数组。--的唯一原因是让PHP知道哪些参数是用于PHP可执行文件,哪些参数是用于您的脚本。这使您可以像这样操作:
php -e -n -f myScript.php -- -f -n -e

--之后的-f、-n和-e选项将传递给文件myScript.php。而在--之前的选项将传递给PHP本身。


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'];
    }
?>

这应该是被接受的答案,第一行 parse_str(implode('&', array_slice($argv, 1)), $_GET); 正好做了需要的事情 - 将所有键值对转换为一个 $_GET[ key => value ] 数组。 - dev_masta

1

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

您最有可能想使用PEAR包Console_CommandLine:“一个功能齐全的命令行选项和参数解析器”。

或者,您可以自己添加代码来遍历您的ARGV并设置参数。以下是一个非常简单的片段,可帮助您入门(如果第一部分不是有效的变量名或ARGV部分中有多个“=”则无法正常工作):

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

0

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

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

$param = $tmp[1];            // $param = "test";

0
您可以这样操作:
if($argc > 1){
    if($argv[1] == 'param=test'){
        $param = 'test';
    }
}

当然,如果需要的话,你可以变得更加复杂。


0
你可以使用类似以下的代码:
if (isset($argv[1]) {
  $arg1 = $argv[1];
  $arg1 = explode("=", $arg1);
  $param = $arg1[1];
}

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

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

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


0
如果你喜欢生活在前沿,PHP 5.3有getOpt()命令可以为你处理所有这些混乱的业务。有点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接