11

ファイル a.php:

<?php
echo "abcdef";
?>

ファイル b.php:

<?php
$h=popen('php a.php',r);
pclose($h);
?>

質問:

コンソールにエコー結果が表​​示されません。なぜ、どのように見るのですか?

次のようなファイル b.php で実行したくありません。echo stream_get_contents($h);

4

3 に答える 3

11

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 から読み取るパイプを削除します。

于 2013-04-13T13:38:43.980 に答える
5

コンソールに送信されていないため、エコーの結果はコンソールに表示されません。プロセスを読み取りモードで開くことにより、その STDOUT が開いているプロセスのファイル ハンドルにリンクされました。出力がコンソールに表示される唯一の方法は、そのファイル ハンドルから読み取り、エコーすることです。

流れは、つまり、こういうことです。

  • b.php の実行が開始されます - その STDIN と STDOPUT は通常どおりコンソールにリンクされます
  • 読み取りモードで popen を呼び出し、ストリーム リソースを $h に格納します。
  • これにより、a.php が実行を開始し、STDOUT は $h のファイル記述子にリンクされ、STDIN は何にもリンクされません。
  • これは、ご覧のとおり、b.php が開始されたコンソールに a.php が直接アクセスできないことを意味します。
  • a.php はその出力をそのストリームに書き込み、実行を終了します
  • b.php は $h のストリームに対して何もせず、ストリームを閉じるだけなので、a.php の出力は失われます。

ここで何が起こっているのかを説明してくれることを願っています。a.php の出力をコンソールに表示したい場合は、b.php のみがコンソールにアクセスできるため、b.php は $h のストリームからそれを読み取り、エコーする必要があります。

または、popen() の代わりに system() を使用すると、system() を使用すると、メイン スクリプトの STDIN と STOUT が、呼び出したプログラムまたはスクリプトに渡されるため、呼び出し元のスクリプトのコンソールに出力が自動的に出力されます。

于 2014-08-22T01:30:18.783 に答える