less
PHP のコマンドラインから および類似のプログラムを実行したい。
通常の容疑者(exec、shell_exec、passthruなど)を試しましたが、それらの多くはファイルを画面にダンプできますが、使用する前にプロセスが終了します。私が望むならcat
、私はそれを使うだろう.
この方法でプログラムを実行するにはどうすればよいですか?
less
PHP のコマンドラインから および類似のプログラムを実行したい。
通常の容疑者(exec、shell_exec、passthruなど)を試しましたが、それらの多くはファイルを画面にダンプできますが、使用する前にプロセスが終了します。私が望むならcat
、私はそれを使うだろう.
この方法でプログラムを実行するにはどうすればよいですか?
proc_open
パイプを介してプロセスに入力をフィードし、プロセスから出力を取得するために使用できます。cat
ただし、基本的にコマンドに分解されるため、パイプを介したユーザーの操作はあまり許可されていないようです。これが私の最初の(失敗した)アプローチです:
<?php
$dspec = array(
0 = array('pipe', 'r'), // pipe to child process's stdin
1 = array('pipe', 'w'), // pipe from child process's stdout
2 = array('file', 'error_log', 'a'), // stderr dumped to file
);
// run the external command
$proc = proc_open('less name_of_file_here', $dspec, $pipes, null, null);
if (is_resource($proc)) {
while (($cmd = readline('')) != 'q') {
// if the external command expects input, it will get it from us here
fwrite($pipes[0], $cmd);
fflush($pipes[0]);
// we can get the response from the external command here
echo fread($pipes[1], 1024);
}
fclose($pipes[0]);
fclose($pipes[1]);
echo proc_close($proc);
一部のコマンドでは、このアプローチが実際に機能する可能性があると思います.phpのマンページにいくつかの例がproc_open
あります.less
答え。
...しかし、それless
が必要な場合は、シミュレートするのは簡単に思えます。たとえば、コマンドの出力を行の配列に読み取り、それを一口サイズのチャンクで供給することができます。
<?php
$pid = popen('cat name_of_file_here', 'r');
$buf = array();
while ($s = fgets($pid, 1024))
$buf[] = $s;
pclose($pid);
for ($i = 0; $i < count($buf)/25 && readline('more') != 'q'; $i++) {
for ($j = 0; $j < 25; $j++) {
echo array_shift($buf);
}
}
私はこれが可能だとは思わない。PHPはVM/シェル環境ではありません。他のプログラムにアクセスするために必要なコマンドはすべてPHPに制御を戻します。通常、PHPの実行中は対話は行われません。
最後に、バックティック演算子を試してみてください。それが機能しない場合は、スリープしてユーザー入力などを許可するものを自分で作成せずにこれを行うことはできないと確信しています...デフォルトでは
`nano file.txt`