b開發中有沒有碰到須要適時的將結果輸出到瀏覽器頁面而不刷新整個頁面的需求呢?當你在處理一個過程須要耗時很長,但你又須要適時的知道程序當前的處理情況的時候,該怎麼辦呢?下面就分享一下如何使用php及時的輸出當前結果到瀏覽器而不刷新整個頁面的效果吧。 php
下面以一個簡單的例子來講明這個問題。首先來看一段代碼:瀏覽器
for($i=0;$i<10;$i++){ echo $i; sleep(1); }
上面這段程序若是在PHP解釋器中執行,每秒會輸出一個數,和預計效果同樣。但在瀏覽器中訪問時,結果倒是瀏覽器在十秒以後一次性地顯示了全部結果。對於這個問題,咱們可使用 ob_flush() 和 flush() 來強制刷新瀏覽器緩存,程序改成:緩存
for($i=0;$i<10;$i++){ echo $i; ob_flush(); flush(); sleep(1); }
問題解決,但又出來個問題,瀏覽器還不兼容了。實際測試中只有 Firefox 按預計效果即時輸出告終果,而在 IE Safari Opera 等瀏覽器中仍是一次性的輸出結果。查閱相關資料發現是由於不一樣的瀏覽器對緩衝的處理方式不一樣,Firefox 在被要求強制刷新緩存時很聽話,而IE須要在接收到256個字節後纔會將內容即時展示在界面上,Safari 須要1024個字節,Opera 更有個性,只有在遇到HTML標籤的時候纔會即時輸出(Safari也是如此)。 測試
對於以上問題,針對IE和Safari,能夠在輸出結果以前先輸出大於限定數目的空白字符: firefox
echo str_repeat(" ",1024); for($i=0;$i<10;$i++){ echo $i; ob_flush(); flush(); sleep(1); }
而對於Opera、Safari遇到HTML標籤後纔會即時輸出的問題,因爲通常咱們不會只往瀏覽器中輸出純文本內容,故能夠不做考慮。對於上面的程序,能夠在輸出結果中加入HTML標籤來達到目的: ip
echo str_repeat(" ",1024); for($i=0;$i<10;$i++){ echo $i."<br>"; ob_flush(); flush(); sleep(1); }
至此已基本實現了在各個瀏覽器中達到一致的效果了,至於實際工做中,你多是另一種目的可是須要相似這種效果,則只須要根據須要作相應的修改便可。 開發
echo '<script>document.body.innerHTML="";</script>'; //輸出以前清空以前輸出的內容
echo '<script>window.scrollTo(0,document.body.scrollHeight);</script>';//輸出後滾動條自動到最底部 get