2012-03-20 63 views
3

如何在向瀏覽器提供持續/實時反饋的同時從PHP執行shell腳本? 我從system函數文檔理解:如何使用PHP的實時反饋運行shell腳本?

的系統()調用也嘗試如果PHP運行作爲服務器 模塊來自動沖洗web服務器的 輸出緩衝器輸出的每一行之後。

我不清楚它們作爲「服務器模塊」運行的意思。

例PHP代碼:

<?php 

system('/var/lib/script_test.sh'); 

實施例殼代碼:

#!/bin/bash 

echo "Start..." 
for i in {1..10} 
do 
     echo "$i..." 
     sleep 1 
done 
echo "Done." 

此作用:它將等待大約10秒,然後沖洗到輸出緩衝器。

我希望這樣做:每行輸出後沖洗到輸出緩衝區。

+0

服務器模塊= PHP的網絡服務器內(例如mod_php的),並在「CGI」模式沒有運行。 – 2012-03-20 17:37:05

回答

2

這可以通過使用popen()它給你把手給你打開任何程序的標準輸出來完成。可以使用ob_flush()將大塊數據發送到客戶端,可以使用XHR顯示數據。

+0

當然,瀏覽器沒有任何義務去顯示它,因爲它真的是最好的事情是使用ajax輪詢或其他東西,並實際上以非阻塞的方式運行該過程。 – 2012-03-20 17:38:41

+0

@TylerEaves,好想法。儘管我正在使用AJAX調用來加載運行shell腳本的PHP頁面,所以如果我可以使用'popen()'持續刷新,這對我的情況來說很理想。 – 2012-03-20 18:08:41

+0

我在一個我實現的應用程序(不是PHP)中實現這一點的方法是在外部頁面中分配一個作業ID,然後使用結構爲jobid/message/timestamp(unix整數樣式)的表格。對於我插入到消息表中的每行/每組輸出。每秒鐘(這是一個Intranet應用程序,所以延遲很低)。我通過ajax進行輪詢,傳入作業ID和最後處理的消息的時間戳,並返回一個包含時間戳和文本的json數組。將文本預先添加到我的消息div中。完成。簡單。適用於多個用戶。 – 2012-03-20 18:12:09

2

一種選擇是寫在shell腳本文件,在每一步說哪裏就看。在您的網頁上,每X秒/分鐘使用一次ajax呼叫。 ajax調用將調用一個PHP腳本來讀取狀態文件並返回狀態或完成的步驟。

的優勢,這種做法是頁面實時信息將提供給多位訪客,而不僅僅是實際啓動的shell腳本的一個。顯然這可能會或可能不會取決於您的需要。

當然的缺點是較長的AJAX間隔,過時的多個更新會。嵌入式

+0

文件是多餘的,這就是popen存在和stdout處理程序的原因。 – rook 2012-03-20 18:13:15

+0

需要文件訪問而不是popen的情況包括但不限於:跨腳本鏈接,實時數據饋送,xhr結果廣播。 – 2013-11-16 02:06:14