ファイル a.php:
<?php
echo "abcdef";
?>
ファイル b.php:
<?php
$h=popen('php a.php',r);
pclose($h);
?>
質問:
コンソールにエコー結果が表示されません。なぜ、どのように見るのですか?
次のようなファイル b.php で実行したくありません。echo stream_get_contents($h);
popenのドキュメントの 2 番目の例を確認してください。これは、その方法を正確に示しています。
<?php
error_reporting(E_ALL);
/* Add redirection so we can get stderr. */
$handle = popen('/path/to/executable 2>&1', 'r');
echo "'$handle'; " . gettype($handle) . "\n";
$read = fread($handle, 2096);
echo $read;
pclose($handle);
このスニペットは stderr から読み取ります。stdout から読み取るパイプを削除します。
コンソールに送信されていないため、エコーの結果はコンソールに表示されません。プロセスを読み取りモードで開くことにより、その STDOUT が開いているプロセスのファイル ハンドルにリンクされました。出力がコンソールに表示される唯一の方法は、そのファイル ハンドルから読み取り、エコーすることです。
流れは、つまり、こういうことです。
ここで何が起こっているのかを説明してくれることを願っています。a.php の出力をコンソールに表示したい場合は、b.php のみがコンソールにアクセスできるため、b.php は $h のストリームからそれを読み取り、エコーする必要があります。
または、popen() の代わりに system() を使用すると、system() を使用すると、メイン スクリプトの STDIN と STOUT が、呼び出したプログラムまたはスクリプトに渡されるため、呼び出し元のスクリプトのコンソールに出力が自動的に出力されます。