php 實時輸出內容到瀏覽器或到文件

當你在處理一個過程需要耗時很長,但你又需要適時的知道程序當前的處理狀況的時候,該怎麼辦呢?下面就分享一下如何使用php及時的輸出當前結果到瀏覽器而不刷新整個頁面的效果吧。

應用場景:如安裝數據庫,實時顯示每一步信息,如1.數據庫創建成功...2.user表創建成功...3.用戶user1插入成功...

                 再比如執行消耗 job,需要查看執行過程等。

PHP 裏開啓實時輸出方法是 ob_implicit_flush() ,但它大部分情況下都不管用,因爲 php.ini 配置裏 output_buffering 輸出緩衝大部分是 On 開啓的,還有 zlib.output_compression 也經常會被開啓,除了 PHP 這一層,還有 Nginx 的緩衝設置 proxy_buffering ,和壓縮 gzip 也大都是開啓的。爲了一兩個頁面的需求,修改整個服務器的網站配置,恐怕沒有人會做這種選擇。

上邊提到輸出緩存:php腳本實時輸出的問題,一般情況下一個php腳本在全部執行完畢後,纔會將腳本輸出一次性返回,
而在執行過程中的輸出內容是沒有辦法實時獲取的,這種行爲叫輸出緩存。

這裏推薦一下簡單的方法:

set_time_limit(0);
ob_end_clean();
ob_implicit_flush();
header('X-Accel-Buffering: no'); // 關鍵是加了這一行。
echo '現在是:'.date('H:i:s').'<br>';
sleep(5);
echo '五秒後:'.date('H:i:s');

案例1:實時輸出shell腳本日誌,將shell腳本輸出內容重定向到一個日誌文件,再實時輸出

set_time_limit(0);
ob_end_clean();
ob_implicit_flush();
header('X-Accel-Buffering: no'); // 關鍵是加了這一行。
 
while(exec("/home/web/a.sh >> /home/web/a.log 2>&1 &"){
 
    $log = file_get_contents('/home/web/a.log'); //這裏log你可以把每一行都存入數組,然後每次只echo新的行。
    echo "最新一行";
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章