2014-05-06 86 views
1

真的很快的問題。使用PHP shell_exec,使輸出「管道」不「傾倒」

考慮下面的代碼:

//__/var/test/cli_test.php__ 
$x = 0; 
while ($x < 9){ 
    print "loop " . str_pad($x, 3, "0", STR_PAD_LEFT) . "\n"; 
    sleep(1); 
    $x++; 
} 

如果我在命令行鍵入php /var/test/cli_test.php我得到9間隔開的分時間線..即9個正輸出,每秒一個。 EG:這些到貨的時間,曇花一現曇花一現曇花一現......

loop 000 
loop 001 
loop 002 
loop 003 
loop 004 
loop 005 
loop 006 
loop 007 
loop 008 

現在考慮一個不同的命題

//__/var/test/cli_test_shell.php 
print shell_exec("php /var/test/cli_test.php"); 

,如果我在命令行中鍵入php /var/test/cli_test_shell.php我什麼都沒得到9秒鐘,然後一切到達..即1 BIG輸出1 BIG等待。的無EG9秒之後:等待,等待等待..沒有然後轉儲:

loop 000 
loop 001 
loop 002 
loop 003 
loop 004 
loop 005 
loop 006 
loop 007 
loop 008 

如何可以改變/var/test/cli_test_shell.php使得輸出返回每秒

+0

檢查我的答案,它的工作原理;) –

回答

1

試試這個:

$handle = popen('php /var/test/cli_test_shell.php 2>&1', 'r'); 
while (!feof($handle)) { 
    echo fread($handle, 8192); 
} 
fclose($handle); 
+0

我用這個'disable_ob()'固定它http://stackoverflow.com/questions/1281140/run-process-with-realtime-output-in-php – user26676

+0

我很高興你找到了解決方案;) –

1

的期望的行爲是不能使用的每一行shell_exec()。這是因爲該函數收集命令的輸出並將其作爲字符串返回 - 在命令終止後。改爲使用passthru(),並保持cli_test.php原樣。

+0

謝謝:)但你必須誤讀,問題是「我怎樣才能改變/var/test/cli_test_shell.php」。 。你可能會注意到我已經「標記」了passthru(),我不相信它會在沒有ob_flush()的情況下以正確的方式工作,你看到 – user26676

+0

它應該如何與shell_exec()一起工作? 'print'將在'shell_exec()'返回後執行。 – hek2mgl

+0

'shell_exec' /'exec' /'passthru'這都是同一個問題,問題是如何修改它以獲得9條管道「實時」,我最好的猜測是它是一個「exec」 ob_flush回調$輸出,但我不知道如何優雅地實現它 – user26676