7

我正在尝试从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 中的错误吗?

参数传递在在线帮助中处理:

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

这似乎在 PHP 4 下有效,但在 PHP 5 下无效。

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

4

11 回答 11

7

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

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

于 2008-09-15T18:06:14.490 回答
4

您可以使用getopt()函数。

检查博客文章PHP CLI 脚本和命令行参数

于 2011-05-12T12:39:29.813 回答
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 本身)。

于 2008-09-15T18:19:18.327 回答
3

如果要传递类似于 GET 变量的参数,则可以使用parse_str()函数。与此类似的东西:

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

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

于 2011-05-27T19:37:34.740 回答
1

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

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

或者您可以自虐并添加代码来检查您ARGV并自己设置参数。这是一个非常简单的片段,可以帮助您入门(如果第一部分不是有效的变量名或部分中有超过 1 个“=”,这将不起作用ARGV

foreach($argv as $v) {
    if(false !== strpos($v, '=')) {
        $parts = explode('=', $v);
        ${$parts[0]} = $parts[1];
    }
}
于 2008-09-15T18:13:16.390 回答
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'];
    }
?>
于 2014-10-09T03:00:14.657 回答
0

你可以使用类似的东西

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

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

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

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

于 2008-09-15T20:36:22.927 回答
0

您可以执行以下操作:

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

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

于 2008-09-15T18:13:44.597 回答
0

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

于 2009-10-12T21:59:26.967 回答
0

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

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

$param = $tmp[1];            // $param = "test";
于 2008-09-15T18:10:51.030 回答
-1

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

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

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

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

php myscript.php -- myValue

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

于 2008-09-15T19:00:56.293 回答