ndfweb.cn

Response.Flush的使用心得


2009-08-09 08:42:42 (6424)



很多時候我們寫的asp程序會因為做很多操作,所以會花上一分鍾甚至幾分鍾時間。為了使軟件使用者能夠耐心的等待程序的執行,我們經常會希望有一個進度條來表示程序執行的狀態。或者最起碼要顯示一個類似: “數據載入中”,“正在保存數據” 等的說明性文字。此時我們就會用到Response.flush()。他會將緩衝區中編譯完成的數據先發送到客戶端。

  但是有很多時候,我們發現即使我們使用了Response.Flush(),但是並沒有將前麵的信息發到客戶端來顯示。呈獻給我們的依然是白屏。經過反複的測試,我得出一個結論(僅代表個人觀點,可隨意引用,但後果自負)。就是flush的內容至少要有256字節。也就是隻有編譯產生了至少256字節的數據,才能在執行Response.Flush()以後將信息發到客戶端並顯示。

(1)Flush的內容至少要有256字節
  很多時候我們寫的asp程序會因為做很多操作,所以會花上一分鍾甚至幾分鍾時間。為了使軟件使用者能夠耐心的等待程序的執行,我們經常會希望有一個進度條來表示程序執行的狀態。或者最起碼要顯示一個類似: “數據載入中”,“正在保存數據” 等的說明性文字。此時我們就會用到Response.flush()。他會將緩衝區中編譯完成的數據先發送到客戶端。
  但是有很多時候,我們發現即使我們使用了Response.Flush(),但是並沒有將前麵的信息發到客戶端來顯示。呈獻給我們的依然是白屏。經過反複的測試,我得出一個結論(僅代表個人觀點,可隨意引用,但後果自負)。就是flush的內容至少要有256字節。也就是隻有編譯產生了至少256字節的數據,才能在執行Response.Flush()以後將信息發到客戶端並顯示。
  以上內容來自http://www.webjx.com/htmldata/2005-10-10/1128898276.html,經本人測試是正確的。以下給出一個示例代碼:
<html>
<body>
<%
  Call TestFlush ''Flush測試
%>
</body>
</html>

<%
  ''=================================================
  Sub DoSomeThing    ''模擬一個後台操作
      For i=1 To 10000000
            None = i
      Next
  End Sub
  ''=================================================
  Function LongSpaceStr()  ''製造一個長空字符串
    LongSpaceStr = ""
      For i=1 To 256
            LongSpaceStr = LongSpaceStr& " "
      Next
  End Function
  ''=================================================
  Sub TestFlush ''Flush測試
      '用LongSpaceStr加長輸出內容,以使Flush生效
      Response.Write(LongSpaceStr&"正在執行操作,請等待..."&Now()) 
      Response.Flush()

      Call DoSomeThing
        
      Response.Write("<br>操作成功完成!"&Now())
      Response.Flush()  
  End Sub
  ''=================================================
%>
  (2)Response.Flush()調用之前不能出現未閉合的HTML標簽(<html> ,<body>除外)
   比如,以下代碼經測試是不行的:  
<html>
<body>
<table ID="MyTable"><tr><td>
<%
  Call TestFlush ''Flush測試
%>
</td></tr></table>
</body>
</html>
<%
''......略去與上例中同樣的代碼......
%>

  以下代碼經測試是可行的: 
<html>
<body>
<table ID="MyTable"><tr><td></td></tr></table>
<%
  Call TestFlush ''Flush測試
%>
</body>
</html>
<%
''......略去與上例中同樣的代碼......
%>
  以下代碼經測試也是可行的: 
<html>
<body>
<%
  Call TestFlush ''Flush測試
%>
<table ID="MyTable"><tr><td></td></tr></table>
</body>
</html>
<%
''......略去與上例中同樣的代碼......
%>


for i=1 to 256
  yongfa365=yongfa365&"<!--這裏主要是讓前邊先產生256個字符,這樣才可以實時輸出-->"
  if len(yongfa365)>=256 then exit for
 next
        MadeBasic()
        MadeModel()
        MadeIndexBlogItem()
                response.Write "1/6所有模版生成完成<br>"&yongfa365
                Response.Flush()
        MadeIndex("Calendar")
                response.Write "2/6日期索引生成完成<br>"
                Response.Flush()
        MadeIndex("Category")
                response.Write "3/6分類索引生成完成<br>"
                Response.Flush()
        MadeIndex("Blog")
                response.Write "4/6總索引生成完成<br>"
                Response.Flush()
        MadeRSS()
                response.Write "5/6RSS生成完成<br>"
                Response.Flush()
        MadeItem("all")
                response.Write "6/6所有文章生成完成<font color=red>OK,終於完成了</red>"
                Response.Flush()

以上為柳永法(yongfa365)後台動態生成靜態文件一段代碼,目的是讓自己可以看到程序執行到哪了,以前沒加Response.Flush()就隻看那IE狀態欄裏的進度條,感覺好鬱悶,加上Response.Flush()後,感覺就一個字“爽”,下邊是從網上找的一些參考資料彙集:

  不知道大家對Buffer了解多少,很多人對這個概念都比較模糊,尤其是在asp中。很多初學者在編寫asp程序時很少用到這條語句,下麵我就來說說Buffer的用途以及它在asp程序中的作用。

一、Buffer

  Buffer從英文直譯過來的意思是“緩衝區”,這裏我們將它稱為緩衝,因為它不僅是個名詞,還是個動詞。
  緩衝區是存儲一係列的數據的地方,客戶端所獲得的數據可以從程序的執行結果直接輸出,也可以從緩衝區輸出。但是這兩種方式在速度上是有差異的:在web中,當一個asp程序被請求的次數不多時,二者基本上沒有什麼差異,至少我們感覺不出來。但是當有很多人請求一個asp程序時,速度可就不一樣了。如果沒有緩衝區,那麼每個請求asp程序的人的客戶端所得到的結果都是asp程序執行一次所得到的結果,而如果預先將asp程序緩衝,那麼每個客戶端所得到的結果就是緩衝區的結果,不是執行一次程序的結果。比如有1000個用戶同時訪問一個asp頁麵,如果這個asp程序沒有緩衝,那麼程序將被執行一千次,這樣服務器的負荷就回加大,從而導致客戶端打開頁麵速度變慢;如果這個asp程序被緩衝了,那麼結果就不一樣了,每個客戶端直接從緩衝區獲得數據,服務器將不會因為訪問增加而增加程序執行次數,因此客戶端打開頁麵的速度也就比上一種情況要快。這就是Buffer的好處。

二、如何將asp程序緩衝

  這個問題其實很簡單,隻要在asp程序的第一行加上:
<% Response.Buffer = True %>
就可以了。
這句話的意思就是指明輸出頁麵是否被緩衝,當屬性值為True時,服務器將不會向客戶端發送任何信息,直到所有程序執行完或者遇到
<% Response.Flush %>或<% Response.End %>
語句,才會釋放緩衝區的信息。
  利用 Response.Buffer=True,Response.Flush 可以增進瀏覽速度,如果一個頁麵 Response.Buffer=False,有30個資料轉輸,若有 100 人瀏覽此頁麵,則有 3000 個來回傳輸,嚴重影響效率;若在起始得設定 Response.Buffer=True,再將整個頁麵分為幾個群組,在適當的地方搭配 Response.Flush,則可大幅改善瀏覽者的體驗。

三、為什麼有時會感覺沒有用
比如:
<%
'警告:沒事別運行這個
for i=1 to 10000
 Response.Write "<b><center><font color=""#FF0000"">我是www.yongfa365.com"&i& "呀</font></center></b>"
 Response.Flush
 response.Clear
next
%>
半天才會出來,而且出來的是一堆,然後才一個一個的接著出來。

原因:

Response.Flush()。他會將緩衝區中編譯完成的數據先發送到客戶端
但是
flush的內容至少要有256字節。也就是隻有編譯產生了至少256字節的數據,才能在執行Response.Flush()以後將信息發到客戶端並顯示。

Clear 方法
Clear 方法刪除緩衝區中的所有 HTML 輸出。Clear 方法隻刪除響應正文而不刪除響應標題
語法
Response.Clear
注釋
調用 Response.Clear 將清楚本頁麵前麵部分所輸出的數據,同時,如果程序設定了 Response.ContentEncoding,Response.Clear 將同時將編碼方式設定為直接傳送。 
應用於Response 對象


四、總結

  Response的Buffer屬性雖然能夠提高頁麵顯示速度,但是也要分什麼情況。如果你正在製作一個普通的個人主頁,訪問量不是很高,並且沒有什麼複雜的執行程序,那麼用不用這個屬性就不是很重要,因為將數據緩衝也需要一段時間,隻不過我們感覺不到罷了;但是如果你正在製作一個大型論壇或者一個產品展示或其他的商務站點,並且訪問量很高,那麼我建議在程序的第一行加入<% Response.Buffer = True %>這句話,因為這樣能夠讓客戶在有效的時間內獲得更多的數據。

附:

一般驗證碼裏文件頭裏有這個
Response.Buffer=false
Response.Expires=0
Response.ExpiresAbsolute = Now() - 1
Response.AddHeader "Pragma","No-Cache"
Response.AddHeader "Cache-Control","Private"
Response.CacheControl = "No-Cache"
就是為了不讓其有緩存。


<html>
<body>
<% Response.Buffer = True %>
<%
  Call TestFlush ''Flush測試
%>
</body>
</html>

<%
  ''=================================================
  Sub DoSomeThing    ''模擬一個後台操作
      For i=1 To 10000000
            None = i
      Next
  End Sub
  ''=================================================
  Function LongSpaceStr()  ''製造一個長空字符串
    LongSpaceStr = ""
      For i=1 To 256
            LongSpaceStr = LongSpaceStr& " "
      Next
  End Function
  ''=================================================
  Sub TestFlush ''Flush測試
      '用LongSpaceStr加長輸出內容,以使Flush生效
      Response.Write(LongSpaceStr&"正在執行操作,請等待..."&Now()) 
      Response.Flush()

      Call DoSomeThing
        
      Response.Write("<br>操作成功完成!"&Now())
      Response.Flush()  
  End Sub
  ''=================================================
%>
本文版权:http://www.ndfweb.cn/news-407.html
  NDF俱乐部
  国际域名注册
  建站咨询
简体中文 NDF网站建设淘宝店 | ICO图标在线生成 | 外贸网站建设 | 联系我们
©2007-2025 NDF Corporation 鲁ICP备08005967号 Sitemap - RSSRSS订阅