我有两个用于命令行的PHP脚本:
由于独立脚本使用getopt(),我想在包含之前更改它在shell循环脚本中解析的参数列表。我已经尝试将$ argv和$ _SERVER ['argv'](分别是argc)设置为新值,但似乎getopt()不读取这些变量,但是 - 所以我假设 - 它直接访问传递给php的参数。 (除非我犯了一些愚蠢的错误..)
所以我的问题是:getopt()使用的参数列表是否可以在php脚本中轻易改变,怎么做?如果没有,出于好奇的考虑,我也想知道是否有一种肮脏的方式去做?
壳loop.php:
do {
echo "> ";
$cmd = trim(fgets(STDIN));
if (in_array($cmd,array('exit','bye')))
{
break;
}
$argv = explode(' ',$cmd);
// .. add some options here
array_unshift($argv,'--option1');
array_unshift($argv,'--option2');
// ...
$argc = count($argv);
$_SERVER['argv'] = $argv;
$_SERVER['argc'] = $argc;
// standalone.php relies on getopt() to get any optional parameters
include __DIR__ . '/standalone.php';
} while(true);
在include(带有实际参数)之前的和var_dump($ GLOBALS):
array(10) {
["GLOBALS"]=>
*RECURSION*
["argv"]=>
array(5) {
[0]=>
string(6) "bt.php" <- inserted option
[1]=>
string(4) "--nl" <- inserted option
[2]=>
string(1) "-" <- inserted option
[3]=>
string(2) "on"
[4]=>
string(2) "A1"
}
["argc"]=>
&int(5)
.. GET POST etc here ..
["_SERVER"]=>
array(30) {
.. many things here ..
["argv"]=>
array(5) {
[0]=>
string(6) "bt.php" <- inserted option
[1]=>
string(4) "--nl" <- inserted option
[2]=>
string(1) "-" <- inserted option
[3]=>
string(2) "on"
[4]=>
string(2) "A1"
}
["argc"]=>
int(5)
}
}
引用here的第三方getopt类可以完成这项工作,是的。
当我有空的时候,我会查看php的getopt实现,但是认为在这里回答问题可能会很有趣..
从结构上讲,这种方法在我的案例中是有道理的,但是我可以采用不同的方式。