這次項目涉及到一個淘寶資料收集的過程,使用thinkphp實作的整個網站。其中在資料收集的過程中,因為資料導入是一項很費時的事情,如果讓導入頁面一直沒有響應,使用者都不知道發生了什麼事情。三波一折,總算是完成了一個簡單的進度條。
- 第一波:我在背景頁面的處理函數中調用this->display('')顯示頁面,而在對應的顯示頁面中定時調用背景的report函數,report則取出儲存在session中的stage和progress。stage和progress是在處理函數中随時更新的(這種方法問題在于php是單線程的,即使調用了display也不會立即顯示頁面);
- 第二波:ajax請求導入資料,然後定時詢問。和上面一樣,每次處理都把階段和進度寫入session中,按道理來說是可以的,不過并沒有預期的效果,總是在最後蹦出個導入完成,100%。後來将進度寫入到資料庫中,然後定時詢問資料庫,同樣沒有效果。感覺是不是以為寫入太頻繁了,雖然也有降低頻率,但是依然沒有收到好效果,看來必須完全放棄這種方式了;
- 第三波:ajax應答式。将收集過程分為多個階段,使用ajax送出請求。ajax送出格式為 table和page,傳回結果指明下一次的table,目前頁,總頁數 和 是否結束。是以我想當然的使用了while循環,即沒有完成就一直循環送出請求。結果不知道把FF弄崩潰了好幾次,淘寶api也限制了我的使用。現象是 單步調試沒問題,但是一旦運作起來就卡死。後來終于發現普通的ajax調用時異步的,是以我的while循環在很短的時間内向伺服器送出了無數個請求,導緻伺服器也向淘寶送出了無數個請求,各種崩潰中。
- 第一折:ajax同步方式。這種方式在上面的基礎上,将ajax請求修改為同步的,這樣,每次送出都等待上一次的結果。這次在FF中成功運作了,當我看到進度條傻傻的前進時着實興奮。不夠很快我就發現有兩個問題:1,進度條不平滑,沒有動畫效果,直接分成幾個階段,很死闆;2,重要的是chrome和ie中都無法看到效果,依然是卡頓然後是100%。後來查了一下,好像是chrome和ie在ajax的同步方式上是有問題的,看來還是不行。既然ie都無法支援,看來同步方式是留不得,隻能采取異步;
- 功成:ajax異步方式。既然是異步方式,那麼必須有一個變量判斷ajax是否傳回。如果傳回了,則再次送出請求直到結束。在每次定時任務都可以修改進度條的值,這樣也可以解決動畫問題。隻是每次傳回的值中需要提供此階段的最大值,以保證每次請求傳回的時候進度條沒有設定到超過這一次的進度即可。
通過這次問題的解決,我發現自己在做事之前并沒有充分的思考成熟,是以才有了前面的一折三波。總之,要深刻了解基本概念,想清楚問題後再動手才會事半功倍。END