使用PHP 的Shell_exec 進行即時輸出監控
PHP 的shell_exec 函數提供了一種在PHP 腳本中執行系統命令的便捷方法。但是,預設情況下,它僅在完成後會傳回命令的整個輸出。此限制可能會使監視長時間運行或互動式命令的即時進度變得具有挑戰性。
為了解決此限制,PHP 提供了替代選項,允許程式設計師增量讀取和顯示命令輸出,從而允許使用者觀察進程的即時狀態。
其中一個方法是使用 PHP 的 popen() 函數。 popen() 允許腳本將進程的 stdout 流作為 PHP 流打開,使開發人員能夠與其交互,就像它是常規文件一樣。這使得可以使用 fread() 等方法即時讀取命令的輸出。
另一個簡化即時輸出顯示的方法是 passthru() 函數。該函數直接將命令的結果輸出到目前輸出緩衝區,而不將其儲存在變數中。這種方法對於快速顯示命令的輸出特別有用,無需額外的處理或操作。
要示範如何使用popen() 進行即時輸出監控,請考慮以下程式碼:
<?php echo '<pre class="brush:php;toolbar:false">'; // Start the ping process $proc = popen('ping -c 10 127.0.0.1', 'r'); // Continuously read the output and display it in real-time while (!feof($proc)) { echo fread($proc, 4096); flush(); } echo '';
在此範例中,popen() 用來開啟以下程式碼:
在此範例中,popen() 用來開啟下列程式碼:在此範例中,popen() 用來開啟下列程式碼:在此範例中,popen() 用來開啟下列程式碼:並將其分配給$proc 變數。在 while 迴圈內,fread() 函數用於連續讀取並即時顯示指令的輸出。呼叫flush()函數是為了確保輸出直接傳送到使用者的瀏覽器而不需要任何緩衝。透過使用 popen() 和 fread(),此程式碼允許開發人員監視 ping 命令的即時進度並觀察產生的結果。 需要注意的是,使用這些技術可能會幹擾某些功能伺服器配置,例如會話或 nginx 緩衝。要解決這些問題,請考慮在進入輸出緩衝循環之前呼叫 session_write_close() 或設定標頭 header('X-Accel-Buffering: no');防止 nginx 緩衝輸出。以上是如何監控 PHP 中 Shell 指令的即時輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!