通常PHP都做http方式请求了,可以使用GET or POST方式接收参数,有些时候需要在shell命令下把PHP当作脚本执行,比如定时任务。这就涉及到在shell命令下如何给php传参的问题,通常有三种方式传参。
1.使用$argv or $argc参数接收
$argc
=> 参数个数$argv
=> 参数 数组类型
/var/www/swoft # php bin/swoft rpc:start insw=qwewewe
接收到3个参数array(3) {
[0]=>
string(9) "bin/swoft"
[1]=>
string(9) "rpc:start"
[2]=>
string(12) "insw=qwewewe"
}
2.使用getopt函数
规则类似shell里的getoptgetopt('p:t:')
php代码:
$arr = getopt('p:t:');
var_dump($arr);
linux 执行:
---------------------
/var/www/swoft # php bin/swoft -p 8080 -t http rpc:start
array(2) {
["p"]=>
string(4) "8080"
["t"]=>
string(4) "http"
}
问题:多台机器共用一份swoft代码,配置文件怎么解决
思路
- 调整输入的启动swoft框架的命令 php bin/swoft rpc:start 在后追加扩展命令ext_init
- 在app\server\swoft\bin\bootstrap.php中获取ext_init的命令
- 再把获取的命令传递到init.sh中
- 然后在init.sh中根据命令内容把结果写入.env中
实际操作:
获取命令行的
$retCall = " ";
if ($extInitCalls = strstr($argv[$argc - 1], 'ext_init')) {
$initCalls = (explode('=', $extInitCalls))[1];
if ($calls = strstr($initCalls, '?')) {
$calls = explode('?', $initCalls);
foreach ($calls as $key => $call) {
$retCall .= str_replace(":"," ", $call)." ";
}
} else {
$retCall .= str_replace(":"," ", $initCalls)." ";
}
}
exec("sh /www/init.sh ".$retCall, $result, $status);