php 獲取命令列引數
阿新 • • 發佈:2021-06-29
通常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裡的getopt
getopt('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);