【问题标题】:php - same source code for command line or web with argumentsphp - 带有参数的命令行或 Web 的相同源代码
【发布时间】:2014-04-09 13:03:36
【问题描述】:

如果你是从 web 调用 php 页面,你可以给 as ../../somepage.php?myid=1&trackno=2&anotherparam=3 然后您可以使用 $_REQUEST 或 $_GET 来检索信息

在命令行中,您可以使用 $options = getopt("a:b:c:");获取通过参数传递的选项

如何确保相同的源代码在 web 或命令行中都可以使用?

【问题讨论】:

  • CLI 参数和 HTTP 参数只是不同。所以你需要自己处理这个问题
  • 包含一个“参数解析器”,它首先决定它在什么环境中运行,然后进行相应的解析,最后以相同的方式使参数可用。这样您就不必在主脚本中费心了。

标签: php arguments


【解决方案1】:

假设您的请求如下所示;

WEBhttp://domain.com/somepage.php?myid=1&trackno=2&anotherparam=3

CLIphp /path/to/this/php/file/somepage.php 1 2 3

你可以使用下面的php代码;

<?php

if (!empty($_REQUEST)) {
    $myid = $_REQUEST["myid"];
    $trackno = $_REQUEST["trackno"];
    $anotherparam = $_REQUEST["anotherparam"];  
} else if (!empty($argv)) {
    $myid = $argv[1]; 
    $trackno = $argv[2]; 
    $anotherparam = $argv[3];   
} else {
    die("Invalid request!");
}

您已经知道如何处理网络请求,您可以参考here 了解更多关于$argv 的详细信息。简单来说,

$argv[0] => 脚本名(somepage.php),

$argv[1] => 第一个参数,...,

$argv[n] => (n-1)th 参数

编辑:

为了不遗漏命令行参数的顺序,您可以使用命名约定,例如;

php somepage.php myid_1 anotherparam_2 trackno_3

您可以使用以下方法来处理此问题;

foreach ($argv as $k => $v) {
    if ($k == 0) continue;
    $temp = explode("_", $v);
    ${$temp[0]} = $temp[1];
}

简单地说,

myid_3 变为 $myid = 3;

变量名隐藏在值中,因此您无需了解序列

【讨论】:

  • 有没有办法像 Web 界面一样执行命令行参数?想要确保参数被命名..因为我可能会改变顺序或有时会丢失一些。
  • @Joel 您可以在参数传递中使用命名约定。查看我的更新答案
猜你喜欢
  • 2018-03-11
  • 2022-08-03
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 2020-11-08
相关资源
最近更新 更多