用戶端發起一個ajax請求:
$("#data_container").load(server_url,{start_query_id:some_query_id});
要求伺服器端需不斷返回當前進度資料並返回至用戶端,比如,用戶端不斷顯示:當前查詢的user_id是5,該使用者資訊是blahblahblah......
一開始我覺得很簡單,ob_flush不就解決了嘛:
for($i=0;$i<100;$i++){
echo $i."
";
flush();
ob_flush();
sleep(2);
}
結果,還是過了很久,然後PHP才一次性全部輸出。想問一下這個錯在哪?
這樣不行的話,只能用iframe載入了,iframe內嵌頁面通過ob_flush()解決時時輸出當前查詢的效果,但理論上瀏覽器的載入條會一直處於轉圈圈狀態,不合適。
剩下的只能是用ajax每返回一次資料便重新再提交一次query_id的形式,頁面要不停請求伺服器,請求時間也大幅增加,也加大了伺服器負擔。
用websocket,暫且不討論他的瀏覽器可憐的相容性了,PHP天生就不是幹websocket的料吧。
然後,就不知道咋辦了,有沒有比較簡單而且友好的處理這種問題的方式?
回複內容:
用戶端發起一個ajax請求:
$("#data_container").load(server_url,{start_query_id:some_query_id});
要求伺服器端需不斷返回當前進度資料並返回至用戶端,比如,用戶端不斷顯示:當前查詢的user_id是5,該使用者資訊是blahblahblah......
一開始我覺得很簡單,ob_flush不就解決了嘛:
for($i=0;$i<100;$i++){
echo $i."
";
flush();
ob_flush();
sleep(2);
}
結果,還是過了很久,然後PHP才一次性全部輸出。想問一下這個錯在哪?
這樣不行的話,只能用iframe載入了,iframe內嵌頁面通過ob_flush()解決時時輸出當前查詢的效果,但理論上瀏覽器的載入條會一直處於轉圈圈狀態,不合適。
剩下的只能是用ajax每返回一次資料便重新再提交一次query_id的形式,頁面要不停請求伺服器,請求時間也大幅增加,也加大了伺服器負擔。
用websocket,暫且不討論他的瀏覽器可憐的相容性了,PHP天生就不是幹websocket的料吧。
然後,就不知道咋辦了,有沒有比較簡單而且友好的處理這種問題的方式?
ob_flush()和ajax並不是你想象的那種效果。
iframe內嵌頁面通過ob_flush()可以實現你要的,但是有你說的"轉圈圈"。
前端設定定時器,不斷髮送ajax請求,這是目前通行的做法。
要想最佳化ajax,可以查一下Commet。
另外,建議你思考一下你是否真的想要在一個大批量的耗時的操作裡,一點點的輸出每一個使用者的所有資訊。
假進度條演算法
完成進度條為100%
0 ~ 25% :隨機遞增 3% ~ 6% 每秒
25% ~ 65%:隨機遞增 0.1% ~ 3% 每秒
65% ~ 90%:隨機遞增 0.1% ~ 2% 每秒
90% ~ 99%:固定遞增 0.5% 每秒
直到請求完成直接增長到100%
贊同 假進度條方法,我們以前就是這麼幹得。只要確保處理完畢後就是100%就行,中間速度愛咋咋地。
樓上說的假進度不錯