我有两个 PHP 脚本供命令行使用:
- Standalone.php:使用本机getopt()函数的独立脚本。
- shell-loop.php:一个类似于 shell 的接口,它重复读取一行,必要时退出,否则将输入以及在这个“shell”环境中定义的一些添加传递给通过包含调用的独立脚本
由于独立脚本使用 getopt() 我想在包含之前更改它在 shell-loop 脚本中解析的参数列表。我尝试将 $argv 和 $_SERVER['argv'] (分别为 argc )设置为新值,但似乎 getopt() 不会读取这些变量,但是 - 所以我假设 - 它直接访问传递给 php 的参数。(除非我犯了一些愚蠢的错误..)
所以我的问题是:getopt() 使用的参数列表是否可以轻松地从 php 脚本中更改,如何更改?如果没有,出于好奇,我还想知道是否有一种肮脏的方式来做到这一点?
外壳循环.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);
和 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)
}
}
这里引用的第三方 getopt 类可以完成这项工作,是的。
当我有时间时,我会查找 php 的 getopt 实现,但我认为在这里回答这个问题可能会很有趣..
从结构上讲,这种方法对我来说是有意义的,但是是的,我可以用不同的方式来做。