2011年3月18日 星期五

iis 壓縮網頁,增加網頁效能

應用 IIS 6.0 的 Gzip 壓縮功能降低網路傳輸量

生存在資訊爆炸的網頁程式設計師們應該都會遇到網站效能不佳的問題,然而網站效能不佳有多種原因,舉凡 Web Server 本身的效能問題、系統架構設計不良、後端資料庫負載過重及設計不良,Web Server 將網頁內容傳輸到使用者瀏覽器的網路傳輸問題等等,這些都是需要面對的問題,網路傳輸問題最簡單也最容易解決的就是降低Web Server傳輸到使用者瀏覽器的網頁內容大小,降低網頁內容大小也有多種方法,例如把HTML檔案的換行及不必要的空白字元移除,CSS 盡量設計共用架構不要使用 Inline,壓縮 Javascript 檔案,縮小引用的圖檔等,還有一個大部分 Web Server 如: WebSphere、APACHE、IIS 5.0 以上都支援的 GZIP HTTP 壓縮功能,不過你用壓縮功能一定要犧牲一些 CPU Time ,目前大部分入口網站也都使用此項功能來減少頻寬的使用率,有效的提高網頁瀏覽的速度,我的 E 政府 (www.gov.tw)、Yahoo(tw.yahoo.com) 等大型入口網站也都有使用 GZIP,這也說明了他是個很普遍的技術,如果想提升瀏覽速度的話,不妨盡快評估導入此功能。


壓縮前:
傳回的 html 為未壓縮的內容.


壓縮後:
content-encoding: 的內容己修改為 gzip


相關工具:
IIS 6.0 Resource Kit Tools:
http://www.microsoft.com/downloads/details.aspx?FamilyID=56fc92ee-a71a-4c73-b628-ade629c89499&DisplayLang=en


相關文章:
1.應用 IIS 6.0 的 Gzip 壓縮功能降低網路傳輸量:
http://www.icopy.net.tw/print/forum_posts.asp?TID=459

2. 網頁壓縮檢測: http://gzip.zzbaike.com/
檢測結果:
原本 24.3 kb 的 html 到 client 端只剩 4.5kb, 壓縮率到 81.4%.

3. Enabling HTTP Compression (IIS 6.0)
http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/502ef631-3695-4616-b268-cbe7cf1351ce.mspx?mfr=true



設定方式:
啟用動態頁面(asp,dll,exe)內容壓縮的指令:
cscript adsutil.vbs set w3svc/filters/compression/parameters/HcDoDynamicCompression true

建議: 動態壓縮比設低一點, 可以兼顧 Server CPU performance 及 網路傳輸的 performance


啟用靜態頁面(html,htm,js,css)內容壓縮的指令:
cscript adsutil.vbs set w3svc/filters/compression/parameters/HcDoStaticCompression true

附註: adsutil.vbs 檔案已經放在 C:\Inetpub\AdminScripts\ 目錄下.

這2個步驟, 可以用滑鼠來做,

1.開啟「網際網路資訊服務(IIS)管理員」,選擇「網站」後點選滑鼠右鍵選擇「內容(R)」。

2.選取「服務」頁籤後,請勾選「壓縮應用程式檔案」和「壓縮靜態檔案」,其餘HTTP壓縮相關設定請視伺服器效能設定。

3.返回「網際網路資訊服務(IIS)管理員」,選擇「網頁服務延伸」,選擇後右方區塊會顯示網頁服務延伸項目,請在空白處點選滑鼠右鍵選擇「新增網頁服務延伸(A)」。

4.請設定延伸名稱為「GZIP」,新增一筆需要的檔案為「C:\WINDOWS\system32\inetsrv\gzip.dll」(此為預設位置可能因為您安裝的不同而有所不同),並勾選「設定延伸狀態成允許」後確定。

5.當前述步驟執行完畢後,就會在網頁服務延伸項目中看到GZIP。

6.接下來設定GZIP可以壓縮的副檔名,返回「網際網路資訊服務(IIS)管理員」,選擇「主機名稱(本機電腦)」後點選滑鼠右鍵選擇「內容(R)」。

7.在「網際網路資訊服務」頁籤,請勾選「啟用直接Metabase編輯(N)」。

8.接下來請開啟「c:\windows\system32\inetsrv\MetaBase.xml」(此為預設位置可能因為您安裝的不同而有所不同),並搜尋「IIsCompressionScheme」字串。
可以執行指令 notepad c:\windows\system32\inetsrv\MetaBase.xml


9.請設定「HcDoDynamicCompression」及「HcDoOnDemandCompression」兩個屬性為TRUE。

10.設定「HcDynamicCompressionLevel」壓縮等級1 - 9,數字越大越耗費CPU資源,請視伺服器效能設定。建議: 使用 3 或 5 即可.

11.設定「HcFileExtensions」靜態頁面副檔名,可設定類型建議為
htm
html
xml
css
txt
pdf
doc
js
swf
txt

12.設定「HcScriptFileExtensions」動態頁面副檔名,可設定類型建議為
asp
aspx
asmx
dll
exe

13.存檔完畢,重新啟動IIS。



資料來源:



2010年5月26日 星期三

以Asp實作Virtual Directory

原理:
透過自定 Http 的 404 - file not found, 來實作 Virtual Directory (虛擬目錄).


執行畫面:
把 max.jsp 設定成去執行某個 asp



設定方式:
1. 設定 IIS:
設定 404 的類型為 URL,
內容為 /inc/max.404Handler.asp


2. 設定 重導 URL 的 mapping 在 /public/404Handler/404.xml
3. 後台 Virtual Directory 的設定界面在 /admin/virtualDirectory/editact.asp


附件清單:
\web\inc\max.404Handler.asp
\admin\virtualDirectory
\admin\inc\max.404Handler.asp
\admin\inc\max.DB.Function.asp
\admin\inc\max.File.Function.asp
\admin\inc\max.String.Function.asp
\admin\virtualDirectory\editact.asp
\public\404handler\404.dtd
\public\404handler\404.xml


附件下載:



資料來源:

2010年4月29日 星期四

[JS].日曆元件更新.201004229

說明: 增加 "縮小/放大" 及 "今天 (Today)" 的這2個按鈕.

執行畫面:


相關設定值:
isWinHeader: true (是否要顯示標頭)
isWinDrag: false (是否可以托曳)
isYearEditable: true (年份是否可以下拉選擇)
isMonthEditable: true (月份是否可以下拉選擇)
headerText: '日曆' (標頭要顯示的文字)



附註: 官網的版本, 如果您在 IE6 去使用, 會遇到多跑出一個圖層的話(因為 iframe 的 top 值有錯), 請改用附件裡我修改的版本, 只有修改 dhtmlxcalendar.js 裡的一行指令.



2010年4月28日 星期三

[SQL].判斷未滿20歲的人數是否過半

SELECT
CASE (SELECT COUNT(ACCOUNT) FROM memberdata) WHEN 0 THEN 'No'
ELSE
CASE
Floor(
( SELECT CONVERT(DECIMAL(8, 2), (SELECT COUNT(ACCOUNT) FROM memberdata WHERE Datediff("d", birthday, Getdate()) < 365.25*20) )
/
CONVERT(DECIMAL(8, 2), (SELECT COUNT(ACCOUNT) FROM memberdata))
) + 0.5
)
WHEN 0 THEN 'No' ELSE 'Yes'
END
END AS 'moreThanHalf'

2010年4月12日 星期一

[SQL].取上下筆資料的Sample

分享 T-SQL 的句子, 可以用來取上/下一筆的資料.

附註: row_number() over(...) 這個指令, 要 sql server 2005 以上的版本才有支援.


--// 取上一筆
select top 1 * from (select 欄位1,
row_number() over(order by 欄位2 desc) as rownum
from Table1) myData
where rownum < (
select rownum from (select 欄位1,
row_number() over(order by 欄位2 desc) as rownum
from Table1) myData
where id=?
)
order by rownum desc

--// 取下一筆
select top 1 * from (select 欄位1,
row_number() over(order by 欄位2 desc) as rownum
from Table1) myData
where rownum > (
select rownum from (select 欄位1,
row_number() over(order by 欄位2 desc) as rownum
from Table1) myData
where id=?
)


--// 取自己 rownum
select rownum from (select 欄位1,
row_number() over(order by 欄位2 desc) as rownum
from Table1) myData
where id=?



特別感謝: 鈺鈞告訴我有這個指令.


2010年4月8日 星期四

[Tool].網頁debug工具--Fiddler2

檔案下載:

以下是轉貼的資料:


Fiddler算是微軟的一個「地下產品」。這軟體是免費的、也不推廣、不掛Micorsoft LOGO。

他是一套Debug軟體,會監測我們「看網站」的時候,究竟讀取了哪些網頁、程式、圖片、Flash、JavaScript、影片、CSS。除了Debug的功用之外,換個思路,就可以幫設計師做到一些怪怪的事情。

例如:
1. 抓Flash:
很多Load 來 Load去的Flash網站,你原本只能抓到一個最外層的swf,但現在可以把那些「看的到、但抓不到」的swf全部抓下來。

2. 抓JS,CSS:
不用看HTML原始碼,就知道某網站用了哪些JavaScript、CSS。

3. 抓FLV:
不用看原始碼,就把無名影音或是Youtube的影片(flv)抓回來。
4. 抓圖:
Flash裡頭Load的圖檔。

5. 輕鬆解決網頁設計時的「路徑問題」,尤其是跨網域或是目錄很多層,又有html又有flash的時候。

步驟是:
1. 打開IE。按下Fiddler的按鈕。(可以從Rules\ Hide Images選項,關掉gif,jpg等圖片的紀錄)
2. 進入你要監測的網站。
3. 視窗上面,會出現該網站全部的Session紀錄。(如下圖)
4. 無論你做什麼動作,IE讀取過哪些程式、flash,都會給你網址。

網路行銷參考案例左邊小圖示會告訴你相關的檔案類型,還有結果的http代碼(例如404是找不到檔案)

自己試試。http://www.fiddlertool.com/fiddler/


必須安裝.net framework才能啟動fiddler
http://www.microsoft.com/downloads/details.aspx?FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5&DisplayLang=zh-TW

2010年4月4日 星期日

檢查 SQL Server 有哪些索引應該被重建

如果不能直接執行的話, 要到資料庫屬性 => 選項 => 資料庫相容性層級,會出錯的資料庫相容性層級本來是SQL SERVER 2000(80),改成SQL Server 2005(90)即可。

下面的文章由 will 發表於 2009/1/18:

讓 SQL Server 告訴你有哪些索引應該被重建或重組

我去年有一段時間睡覺前都在看 SQL Server 2005 證照的書(MCTS 70-431),從中學到許多資料庫實際運作的技術細節,例如: 索引的結構。當資料庫中的索引碎裂(index fragmentation)程度過高時,索引的效率就會大大降低,為了避免這個問題發生,就必須定時替資料庫健檢(維護資料庫),也就是進行索引重建(rebuild)或索引重組(reorganize)。

在 Microsoft SQL Server 2005 實作與維護 Ⅱ 此書的第12章有提到你可以透過 SELECT 指令搭配 sys.dm_db_index_physical_stats 這個動態管理函示(DMF, Dynamic Management Function) 可以查出資料庫中所有索引的碎裂狀態,如下 T-SQL 語法:

SELECT OBJECT_NAME(dt.object_id) ,

si.name ,

dt.avg_fragmentation_in_percent,

dt.avg_page_space_used_in_percent

FROM

(SELECT object_id ,

index_id ,

avg_fragmentation_in_percent,

avg_page_space_used_in_percent

FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, 'DETAILED')

WHERE index_id <> 0

) AS dt --does not return information about heaps

INNER JOIN sys.indexes si

ON si.object_id = dt.object_id

AND si.index_id = dt.index_id


執行後的結果長這樣:

查出資料庫中所有索引的碎裂狀態

但何時該做索引重建(ALTER INDEX…REBUILD)?又何時該做索引重組(ALTER INDEX…REORGANIZE)呢?此書也有提供一些建議值供資料庫管理員在進行索引維護時的參考。

索引重組的時機

  • 檢查 External fragmentation 部分
    • 當 avg_fragmentation_in_percent 的值介於 10 到 15 之間
  • 檢查 Internal fragmentation 部分
    • 當 avg_page_space_used_in_percent 的值介於 60 到 75 之間

索引重建的時機

  • 檢查 External fragmentation 部分
    • 當 avg_fragmentation_in_percent 的值大於 15
  • 檢查 Internal fragmentation 部分
    • 當 avg_page_space_used_in_percent 的值小於 60

由於索引的維護都是透過 ALTER INDEX 進行的,所以即便索引的數據分析出來後還是要人工下 ALTER INDEX 指令來重建或重組索引。最近看到一篇文章分享一個很實用的 T-SQL 指令,他可以自動幫你算出哪些索引需要被重建或重組,而且直接幫你把 ALTER INDEX 的 T-SQL 都寫好,程式碼如下:


SELECT 'ALTER INDEX [' + ix.name + '] ON [' + s.name + '].[' + t.name + '] ' +

CASE

WHEN ps.avg_fragmentation_in_percent > 15

THEN 'REBUILD'

ELSE 'REORGANIZE'

END +

CASE

WHEN pc.partition_count > 1

THEN ' PARTITION = ' + CAST(ps.partition_number AS nvarchar(MAX))

ELSE ''

END,

avg_fragmentation_in_percent

FROM sys.indexes AS ix

INNER JOIN sys.tables t

ON t.object_id = ix.object_id

INNER JOIN sys.schemas s

ON t.schema_id = s.schema_id

INNER JOIN

(SELECT object_id ,

index_id ,

avg_fragmentation_in_percent,

partition_number

FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL)

) ps

ON t.object_id = ps.object_id

AND ix.index_id = ps.index_id

INNER JOIN

(SELECT object_id,

index_id ,

COUNT(DISTINCT partition_number) AS partition_count

FROM sys.partitions

GROUP BY object_id,

index_id

) pc

ON t.object_id = pc.object_id

AND ix.index_id = pc.index_id

WHERE ps.avg_fragmentation_in_percent > 10

AND ix.name IS NOT NULL


這段 T-SQL 只有檢查 External fragmentation 部分而已,而且上面分享的這段 T-SQL 語法與原文的數值不太一樣,我有調整過,讓判斷的臨界值符合 Microsoft SQL Server 2005 實作與維護 Ⅱ 書中建議的數值。以下是執行結果的圖示:

自動幫你算出哪些索引需要被重建或重組的結果

你只要複製這些語法,並且執行一遍,就可以完成索引維護了。

相關連結



Facebook 留言板