2013-04-13 16 views

答えて

7

popenにドキュメントの第二の例を確認し、それはそれを行うために正確にどのように示しています

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

3

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

流れは言い換えれば、これです。

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

ここで何が起こっているのかを説明してください。コンソール上でa.phpの出力を見るには、b.phpが$ hのストリームからそれを読み込み、b.phpだけがコンソールにアクセスできるので、それをエコーし​​ます。

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

関連する問題