如何使用浏览器和命令行以相同的方式处理PHP脚本


how to handle a php script same way with browser and command line

我的问题是创建一个简单的php脚本,我想从命令行或浏览器调用参数:

if(!empty($_GET)) {
    $parameters = $_GET;
} else if(isset($argv)) {
    $parameters = $argv;
}
var_dump($parameters);

给出不同的结果:

浏览器:http://localhost/test/script.php?测试= 123

array(1) { ["test"]=> string(3) "123" }

in shell: php script.php test=123

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

您可以使用getopt(或getlongopt)(参见相同的手动链接)

array getopt ( string $options [, array $longopts ] )

命令行的惯用语法是:

program -o val --opt value pos_value

这种语法可以在PHP中使用getopt进行解析。

$options = getopt("f:hp:");
var_dump($options);

如果您打算通过CLI以查询字符串格式传递所有参数(例如test=123&var=me),请查看parse_str()

if(!empty($_GET)) {
    $parameters = $_GET;
} else if(!empty($argv[1])) {
    $parameters = parse_str($argv[1]);
}

如果有分隔,则 decze 有答案

argv参数的第一个元素将始终是已执行的脚本的名称。您可以简单地忽略第一个参数,并从索引1开始。

摘自相关文档:

注意:第一个参数$argv[0]总是用来运行脚本的名称。

正如其他人提到的,您还可以使用getopt函数,该函数专门用于从CLI中提取选项、它们的名称和它们的值。argv变量只是保存传递的参数列表。由于正在执行的实际程序是PHP解释器,因此甚至脚本名称也是一个参数。

php my_script.php another_arg more_args
//  ^ argv[0].....^ argv[1]...^ argv[2]

作为旁注,argv包括执行脚本文件的这种行为在其他平台/技术上是一致的。例如,同样的行为可以在python、bash、awk和许多其他语言中看到。

摘自本页的一般解释

什么是ARGV?
作为一个概念,ARGV是一种编程约定,至少可以追溯到C语言。它指的是"参数向量",它基本上是一个变量,包含通过命令行传递给程序的参数。它通常表现为一个数组,并且可以以这种方式操作,这意味着您可以通过索引引用特定的参数,或者可以以标准方式遍历它们。

我发现我可以调用我的脚本php-cgi而不是php;命令行:php-cgi script.php test=123和浏览器:http://localhost/test/script.php?test=123会得到我想要的结果。谢谢大家