コマンドラインのPHPスクリプトで実行するプログラムとどのように対話できるかを知りたい。シナリオは次のとおりです。PHPのコマンドラインで実行されるプログラムからの質問に応答する
- プログラムの実行を開始します。
- 質問が尋ねられるまで(私が推測するSTDOUTを読むことによって)出力を読みます。
- 答えを入力し、Enterキーを押します(これはSTDINに書き込むと思います)。ユーザーはこれを入力しないでください。スクリプトは、ステップ2の出力を読み取って解釈することで、何を回答するかをすでに知っています。
- 新しい質問が表示されるまで、出力を再度読みます。
- もう一度答えを入力し、Enterキーを押します。ここでも、スクリプトはそれをすべて知っているため、ユーザの入力は行われません。
- この質問/回答のシナリオは、プログラムが終了するまでx回繰り返します。
これを行うPHPスクリプトを作成するにはどうすればよいですか?私はおそらくproc_open()
を使用したいと思っていますが、私はどのように把握できません。私はそれがこのようなものになるだろうと思っていますが、それはもちろん動作しません:
$descriptorspec = array(
0 => array('pipe', 'r'), //STDIN
1 => array('pipe', 'w'), //STDOUT
2 => array('pipe', 'r'), //STDERR
);
$process = proc_open('mycommand', $descriptorspec, $pipes, null, null);
if (is_resource($process)) {
// Get output until first question is asked
while ($buffer = fgets($pipes[1])) {
echo $buffer;
}
if (strpos($buffer, 'STEP 1:') !== false) {
fwrite($pipes[0], "My first answer\n"); //enter the answer
} else {
die('Unexpected last line before question');
}
// Get output until second question is asked
while ($buffer = fgets($pipes[1])) {
echo $buffer;
}
if (strpos($buffer, 'STEP 2:') !== false) {
fwrite($pipes[0], "My second answer\n"); //enter the answer
} else {
die('Unexpected last line before question');
}
// ...and so we continue...
} else {
echo 'Not a resource';
}
UPDATE:私はプログラムがSTDERRに質問を出力することを考え出し(それがファイルにSTDOUTを書き込むため) 。
これをチェックしてください:https://stackoverflow.com/questions/2929629/how-do-i-write-a-command-line-interactive-php-script – jsxqf
@jsxqfあなたは私の質問を読んでいません。私がPHPとやりとりすることではありません。それはPHPが別のプログラムとやりとりすることです(私の入力なし)。 – TheStoryCoder
外部プログラムは、 "STEP 1:"と "STEP 2:"の直後と応答を待つ前に改行( "\ n")を出力しますか?また、質問は常に同じで、同じ順序ですか? –