天天看點

浏覽器緩存導緻FLASH資源更新問題的解決方案

在網上搜浏覽器緩存問題時,遇上了很多問題。一是不知道應該用何種關鍵字搜尋,二是一搜出來,就全是講的是如何禁用浏覽器緩存的方案。

作為大型點的flash webgame來說,不緩存顯然是不行的。總體上來說,我們要想達到的目标就是

一、浏覽器需要緩存

二、當伺服器資源更新時,浏覽器緩存裡相應的老版本資源失效。

下面兩篇文章講到了一個很好的解決方案,并且給出了源碼。。

<a href="http://www.itamt.com/2010/06/browser_cache_prevent_base_on_svn/">http://www.itamt.com/2010/06/browser_cache_prevent_base_on_svn/</a>

<a href="http://www.itamt.com/2010/07/file-revision-prevent-browser-cache-svn/#comment-163">http://www.itamt.com/2010/07/file-revision-prevent-browser-cache-svn/#comment-163</a>

由于作者blog上的代碼無法下載下傳,并且作者的實作與第一篇中描述的略有差異,于是我試着留言給作者。熱心的作者當天就給了我回複。

以下是我整理後的回複内容:

你好, 關于你說的: 

1 、你最後的方案是不是 僅僅在資源請求時,追加一個版本号?  我發現ie浏覽器緩存是将整個請求url緩存下來了的。也就是說,版本号也緩存了。 這樣,當我們使用版本号請求資源時,就可以實作總是得到伺服器上的資源了。 

2、ie和firefox的緩存機制差異有多大?  主要是緩存後的url路徑上。。。

我把我的想法說一下, 盡量表述清楚-_-:

不管ie和firefox浏覽器緩存都是将整個請求url緩存下來的. 而我的解決方案本質與你說的是一樣的, 即"僅僅在資源請求時,追加一個版本号".

一般的做法,釋出新版本時,比如v1.5,我們大可以在所有資源請求都加上"....?v=1.5", 這樣做沒有錯.肯定是會避免浏覽器緩存的.

問題是:這種方法會重新請求所有的資源. 而項目釋出的通常情況是:隻有少部分資源有修改. 是以這種方法是很浪費帶寬的, 也加重了伺服器的壓力. 理想的情況就是:隻重新請求那些被修改過的資源.

下面表述一下我的解決方案: 

假設現在項目是v1.0, 我們要釋出v1.5上去. 我們利用svn産生一份檔案, 來記錄v1.5中所有資源的svn版本号. 當請求一個資源時, 追加這個資源的svn版本号. 如果一個資源(比如: icon.jpg, svn版本号是1010)在v1.5中沒有被修改, 那麼它的svn版本号與在v1.0的svn版本号肯定是一樣的都是1010: 

如果v1.5中一個資源(比如: logo.jpg, svn版本号是1234)是修改過的, 它在v1.0的svn版本号是1222, 請求資源時: 

思路就是這樣的. 是以關鍵是利用svn來記錄的版本号請求資源.

這個解決方案最終實作出來主要是兩個檔案. 

1.cur.txt記錄整個項目目前的svn版本号. 

2.revision.txt記錄項目目前版本中所有資源的svn版本号.

整個項目程式一開始(preloader.swf), preloader.swf會先确定整個項目svn版本号(加載最新cur.txt, 或者在網頁中指定:...preloader.swf?cur=20), 然後根據整個項目svn版本号加載revision.txt, 比如現在項目svn版本是20, 那麼preloader.swf會加載: 

加載完成後, 就可以完成mfilerevisionmanager的初始化...

注意preloader.swf不是進度條(load.swf), 它是整個項目最開始的地方, 是以應該盡可能小, 而且一旦完成最不要再去修改它.

附件裡,有我做的demo. 我的開發環境是fdt4.5+flash cs5.5, 檔案夾tool裡一個ant腳本, 和jsfl腳本. 使用時你需要修改publish.xml開頭的路徑. 然後運作這個ant腳本.

浏覽器緩存導緻FLASH資源更新問題的解決方案

運作ant前, 注意設定下:這樣ant運作期間的輸出資訊會顯示在eclipse裡.

浏覽器緩存導緻FLASH資源更新問題的解決方案

---------------------------------------------------------------

并且,我問了一下他對preloader.swf的了解和用法

回複:

結合我參與的項目,說一下preloader.swf是幹麼用的: 

一般項目肯定會有一個load.swf和main.swf, 其中 

1.load.swf用于顯示加載main.swf的進度,說白了load.swf就是個進度條. 

2.main.swf就是整個項目的主程式. 

而preloader.swf是在load.swf之前加載的.也就是說加載順序是preloader.swf-&gt;load.swf-&gt;main.swf 

preloader.swf主要用來加載"資源版本号檔案"(revision.txt, cur.txt). 并且把整個資源版本機制初始化(在我的方案裡就是mfilerevisionmanager).

當然, 也完全可以把preloader.swf并入load.swf(進度條)中. 但我的經驗是load.swf(進度條)其實是經常需要修改更新的. 而且為了重用性考慮, 我會把preloader.swf用于不同的項目中. 是以把preloader.swf與load.swf分開.

-----------------------------分割線--------------------------------

而考慮到目前項目的原因,我們決定暫時采用一個很簡單的方案。 就是在資源的根目錄下加版本号。

比如 1.0.0版本的資源目錄為

assets_v1.0.0

我要加載一個ui.swf的url就是  “assets_v1.0.0/ui.swf”

而當版本更新時,比如到了1.0.1

我要加載一個ui.swf的url就是 “assets_v1.0.1/ui.swf”

這樣就像回複内容中說的,這會使浏覽器緩存中所緩存的所有資源都失效。 雖然是如此,但總比使用者繼續使用老版本資源好。 并且,對于一個釋出版的更新總會有時間間隔的,不會一天到晚都是這樣的情況。

而待項目趨于穩定後,再集中替換成上面那種最小資源更新的解決方案。

希望上面的資訊能夠幫助到和我一樣迷惑的人。如果這些資訊幫助到了你,請去參拜本文開頭引用的兩篇文章的作者,謝謝!!!!!!

簡介:09年入行,喜歡遊戲和程式設計,對3d遊戲和引擎尤其感興趣。 

版權聲明:本文版權歸作者和部落格園共有,歡迎轉載。轉載必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

轉載:http://www.cnblogs.com/geniusalex/archive/2011/10/12/2209493.html

繼續閱讀