PHP,将参数从命令行传递到 PHP 脚本

问题描述 投票:0回答:9

我想从 PHP 命令行界面传递参数,然后使用 PHP 脚本读取值,如下所示:

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

我像这样从 CLI 传递变量:

C:\xampp\php\php.exe name.php Robby

上面的工作,我得到 Robby 作为输出。

但我想做这样的事情:

C:\xampp\php\php.exe name.php -inputFirstName="Robby"

以便用户充分了解在正确的位置输入正确的参数。解析这些参数的正确方法是什么?

php parameter-passing command-line-interface
9个回答
52
投票

从命令行调用 PHP 脚本时,您可以使用 $argc 来查找传递了多少个参数,并使用 $argv 来访问它们。例如运行以下脚本:

<?php
    var_dump($argc); //number of arguments passed 
    var_dump($argv); //the arguments passed
?>

像这样:-

php script.php arg1 arg2 arg3

将给出以下输出

int(4)
array(4) {
  [0]=>
  string(21) "d:\Scripts\script.php"
  [1]=>
  string(4) "arg1"
  [2]=>
  string(4) "arg2"
  [3]=>
  string(4) "arg3"
}

请参阅 $argv$argc 了解更多详情。

做你想做的事,让我们说

php script.php arg1=4

您需要在等号上展开论证:-

list($key, $val) = explode('=', $argv[1]);
var_dump(array($key=>$val));

这样你就可以在等号前面添加任何你想要的内容,而无需解析它,只需检查 key=>value 对是否正确即可。然而,这有点浪费,只需指导用户按照正确的顺序传递参数即可。


22
投票

我使用这个相当简洁的方法:

if($argc>1)
  parse_str(implode('&',array_slice($argv, 1)), $_GET);

它将处理诸如以下的呼叫:

php script.php item1=4 item2=300

通过将其发送到

$_GET
,您可以自动处理 Web 或 CLI 访问。

对于评论,这是执行以下操作:

  • 如果参数的数量大于一个(因为第一项是脚本的名称),则继续
  • 获取不包括第一项的参数数组
  • 将其转换为带有&符号的标准查询字符串格式
  • 使用
    parse_str
    提取到
    $_GET
    数组

16
投票

虽然答案是正确的并且您可以手动进行解析,但 PHP 还提供了

getopt()
函数,该函数实际上可能在这里有用。

还有面向对象的替代方案(用 PHP 编写,在许多库中可用)可能正是您所需要的。谷歌搜索“php getopt”将产生有用的结果。


7
投票

您可以将参数作为一个参数发送,然后像 $_GET 数组一样解析该参数

C:\xampp\php\php.exe name.php "inputFirstName=Robby&LastName=John"

在你的 PHP 文件中

if (!empty($argv[1])) {
  parse_str($argv[1], $_GET);
}

您将像往常一样在 $_GET 数组中获得参数


5
投票

getopt()
函数可能是该问题中最正确的答案。特别是因为 PHP 5.3 使得它与平台无关。在这个问题的特定情况下并解析多个参数,利用此函数的一种方法如下:

$defaultValues = array("inputFirstName" => "");
$givenArguments = getopt("", array("inputFirstName:"));
$options = array_merge($defaultValues, $givenArguments);
$inputFirstName = $options['inputFirstName'];

将 $inputFirstName 设置为“Robby”的调用将是:

> php script.php --inputFirstName="Robby"

解释

所有预期参数的默认值都在

$defaultValues
数组中设置。通过命令行参数发送的输入由 PHP 的
getopt
函数收集并由
$givenArguments
存储。请注意,
:
字符串末尾的冒号 (
"inputFirstName:"
) 表示这是必需的参数。如果这里没有冒号,则只会检测到参数的存在,而不是实际值(PHP 手册中的更多信息)。在第三行将这两个数组合并在一起会产生数组,其中所有预期参数都使用默认值或命令行/终端提供的参数(如果可用)进行设置。


1
投票

我不知道当时是否有人问过这个问题,我要回答什么是可用的,但如果你打电话

php-cgi -f myfile.php var=something
,你可以从命令行检索
$var=$_GET['var'];
,那么你不必更改您从网络浏览器或命令行调用它的代码


0
投票

如果你不介意使用库,我建议你看一下 Symfony 的控制台组件

它可用于创建命令行应用程序并支持使用参数和选项

文档页面包含一些出色的示例来帮助您入门。

当然,它在幕后使用了 vascowhite 所解释的相同技术。


0
投票

您最大的希望是使用

exec("php -f php.file.php example=js.json > ech0");
echo file_get_contents("ech0");
unlink("ech0");

这就是我在 PipesJS

中使用的

-1
投票

您可以解析程序上的用户输入,查找特定字符串,例如

-inputFirstName="x"
(例如,使用正则表达式),然后将正确的变量设置为 x。

© www.soinside.com 2019 - 2024. All rights reserved.