2013-04-13 28 views
8

文件a.php只會:如何通過php中的popen獲得進程打開的輸出?

<?php 
echo "abcdef"; 
?> 

文件b.php:

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

問題:

我看不到在控制檯上的回聲結果; 爲什麼以及如何看到它?

我不想做它在文件b.php喜歡:echo stream_get_contents($h);

回答

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中讀取。刪除管道以從標準輸出讀取。

3

您無法在控制檯上看到回顯結果,因爲它從未進入控制檯。通過以讀取模式打開進程,其STDOUT被鏈接到打開進程的文件句柄。輸出到達控制檯的唯一方法是,如果您從該文件句柄讀取,然後回顯它。

換句話說,流量就是這樣。

  • b.php開始運行 - 它的標準輸入和STDOPUT鏈接到您的控制檯像往常一樣
  • 它調用讀模式POPEN並存儲在$ H流資源
  • 這將導致a.php只會開跑,其STDOUT與$ h中的文件描述符鏈接,並且其STDIN未鏈接到任何東西
  • 這意味着,正如您所看到的,a.php無法直接訪問啓動b.php的控制檯
  • a.php將其輸出寫入該流,然後結束運行
  • b.php從來不會對$ h中的流做任何事情,它只是關閉它,所以a.php的輸出會丟失。

希望能解釋這裏發生了什麼。如果你想在控制檯上看到a.php的輸出,那麼b.php需要從$ h中的流中讀取它,然後回顯它,因爲只有b.php才能訪問控制檯。因爲使用system()將主腳本的STDIN和STOUT移交給您的程序或腳本,所以如果使用system()而不是popen(),輸出將自動輸出到調用腳本的控制檯上呼叫。

相關問題