《MYSQL數據庫網站前端和后臺性能優化的34條寶貴經驗和方法》要點:
本文介紹了MYSQL數據庫網站前端和后臺性能優化的34條寶貴經驗和方法,希望對您有用。如果有疑問,可以聯系我們。
MYSQL入門1 減少HTTP哀求數量 (Minimize HTTP Requests)?
MYSQL入門tag:content
MYSQL入門80%的用戶響應時間被花費在前端,而這其中的絕大多數時間是用于下載頁面中的圖片、樣式表、腳本以及Flash這些組件.減少這些組件的數量就可以減少展示頁面所需的哀求數,而這是提高網頁響應速度的關鍵.
MYSQL入門樸素的頁面設計當然是減少組件的一種途徑,但有沒有能兼顧豐富的頁面內容和快速的響應速度的方法呢?下面就是一些不錯的技巧,能在提供豐富的頁面展現的同時,減少Http哀求數量:
MYSQL入門合并文件,通過把所有腳本置于一個腳本文件里或者把所有樣式表放于一個樣式表文件中,從而減少Http哀求的數量.當不同頁面需要應用不同的腳本或樣式時,合并這些文件會是一個很大的挑戰,不過在發布網站時進行這種合并,將是提高網站響應速度的重要一步.
MYSQL入門?
MYSQL入門CSS Sprites是減少圖片哀求的首選方案.把所有的背景圖片合并到一張圖中,使用CSS的background-image 和background-position 屬性去控制展現恰當的圖片區域.
MYSQL入門?
MYSQL入門Image maps把多張圖片組合成為一張圖片.圖片的總大小是不變的,但減少Http哀求數會提高頁面的響應速度.Image maps只能用于圖片在網頁中相鄰的情況,比如導航條.制定image maps中的圖片坐標是個很麻煩的過程,而且容易出錯.同時給導航使用image maps也并不易讀,所以并不推薦使用.
MYSQL入門?
MYSQL入門內聯圖片使用data: URL scheme 把圖片數據嵌入頁面,但這會增加Html文檔的大小.把內聯圖片合并到你被緩存的的樣式表中是一個能既減少HTTP哀求數又不會增加頁面大小的方法.但目前并不是所有的主流瀏覽器都支持內聯圖片.
MYSQL入門?
MYSQL入門減少頁面的Http哀求數量是第一步,而且對于提高用戶初次訪問體驗是最重要的一步.正如在 Tenni Theurer的blog中的Browser Cache Usage - Exposed!里描述的,每天,有 40%-60%的訪客并沒有你的網站的緩存文件.提高這些初次訪客的訪問速度是提高用戶體驗的關鍵.
MYSQL入門?
2 使用內容分布式網絡 (Use a Content Delivery Network)
MYSQL入門tag:server
MYSQL入門用戶連接你的網站服務器的速度影響響應的快慢.把你的網站布置在多臺分布于不同地域的服務器上,會讓用戶覺得你的頁面加載速度更快.那么我們應該從哪里開始呢?
MYSQL入門不要一開始就把重新設計你的網站使其能夠適應分布式結構作為實現網站地域分布的第一步.根據你的網站的復雜程度不同,更新網站結構的過程也許會包含諸如同步會話狀態、在服務器間復制數據庫等一系列復雜的步驟.這樣你提高用戶訪問速度的目的反而會被更新網站架構的工作耽誤.
MYSQL入門記住,用戶80-90%的訪問時間被花費在下載頁面中的圖片、樣式表、腳本、Flash這些組件上.這是網站展示的黃金法則.那么與其重新設計網站的結構,不如先實現這些靜態組件的分布.這不僅僅可以大幅減少響應時間,而且由于內容分布式網絡(content delivery networks)的存在,這將是個很簡單的工作.
MYSQL入門內容分布式網絡(CDN)是一系列分布在不同地域的服務器的集合,能夠更有效的給用戶發送信息.它會根據一種衡量網域距離的方法,選取為某個用戶發送數據的服務器.比如,到達用戶最少跳或者最快相應速度的服務器會被選中.
MYSQL入門一些大型Internet公司擁有他們自己的CDN,但使用公用的CDN服務提供商更為劃算,比如 Akamai Technologies, Mirror Image Internet, 或者Limelight Networks.對于剛起步的公司和個人網站來說,CDN服務的花費也許會偏高.但當你的目標用戶越來越多而且趨于國際化,用CDN來降低響應時間就很必要了.在Yahoo!,把靜態的內容從自己的網絡服務器移到CDN提高了用戶20%甚至更多的訪問速度.轉向CDN會是一個只需要相對簡單的代碼更新的工作,而且那將會顯著的提高你的網站訪問速度.
MYSQL入門?
3 給頭部添加一個失效期或者Cache-Control (Add an Expires or a Cache-Control Header)
MYSQL入門tag:server
MYSQL入門這條法則包含兩方面:
MYSQL入門??? * 對于靜態組件:把頭部的緩存期設為某個遙遠的未來,使其能夠“永不過期”.
??? * 對于動態組件:使用適當的Cache-Control頭部幫助瀏覽器執行特定的哀求.
MYSQL入門網頁設計越來越豐富,頁面里包含了越來越多的腳本、樣式表、圖片和Flash.頁面的初次訪問者也許會發送多個HTTP哀求,但通過給頭部添加失效期,你可以使那些組件被緩存.這會避免下次瀏覽頁面時的不必要的HTTP哀求.給圖片文件的頭部設置失效時間更為常用,但包括腳本文件、樣式表和 Flash之類的所有組件的頭部都應該被設置失效時間.
MYSQL入門瀏覽器(還有代理服務器)使用緩存以減少HTTP哀求的數量和大小,提高網頁的加載速度.服務器在HTTP相應中通過頭部中的過期時間告知客戶端一個組件可以被緩存多久.下面是一個far future的過期頭部,告訴瀏覽器這個響應直到2010年4月15日才會過期:
Expires: Thu, 15 Apr 2010 20:00:00 GMT
MYSQL入門如果你使用的是Apache服務器,使用ExpiresDefault 指令會設置一個相對于當前時間的過期時間.這里有一個通過ExpiresDefault 指令把過期時間設為哀求時間之后10年的例子:
ExpiresDefault "access plus 10 years"
MYSQL入門記住,如果你使用了far future過期頭部,你必須在組件更新時更換它的名字.在Yahoo!我們通常在建設網站的過程中執行這樣的步驟:組件的名字里包含了它的版本,比如:yahoo_2.0.6.js.
MYSQL入門使用一個far future過期頭部只會在用戶已經訪問你的網站之后起作用.它不會影響一個沒有緩存的初次訪問者的HTTP哀求數量.所以這一切的效果取決于多少用戶訪問頁面時有一份預緩存(一份"預緩存"中已經包含了頁面的所有組件).我們對此在Yahoo!做過測試,發現擁有預緩存的用戶在 75-85%.給頭部添加far future失效期,可以增加瀏覽器緩存的組件數量并重復用于隨后的頁面瀏覽而不需要通過用戶的網絡發送哪怕一個字節.
MYSQL入門?
MYSQL入門4 Gzip壓縮組件(Gzip Components)
MYSQL入門tag:server
MYSQL入門前臺工程師的決策能夠顯著的減少在網絡上傳輸 HTTP哀求和響應花費的時間.確實,終端用戶的帶寬速度、Internet服務提供商和連接交換機的服務器這些因素都是開發小組所不能控制的.但還有一些其它因素會影響響應的時間,比如壓縮文件,就會減少HTTP響應的大小從而減少響應的時間.
MYSQL入門從HTTP/1.1開始,Web客戶端就被設定為支持HTTP哀求的頭部中Accept-Encoding指定的壓縮格式:
Accept-Encoding: gzip, deflate
MYSQL入門當服務器檢測到哀求頭部中的這一代嗎,它就會使用客戶端提供的方法列表中的一個來壓縮響應內容.而服務器通過響應頭部中的Content- Encoding來告知客戶端它所使用的壓縮方式:
Content-Encoding: gzip
MYSQL入門Gzip是當前最常用也是最有效的壓縮方式,GNU項目開發了這一方法并且符合RFC 1952標準.另外一種你可能見過的壓縮格式是deflate,但它沒有那么有效和常用.
MYSQL入門使用gzip壓縮通常會減少70%的響應大小.當前瀏覽器中大約90%的Internet通訊傳輸聲明支持gzip.如果你使用Apache服務器,配置gzip的模塊取決于服務器的版本:Apache 1.3 使用mod_gzip ,而Apache 2.x 使用mod_deflate.
MYSQL入門瀏覽器和代理會有一些已知的問題,可能導致瀏覽器的預期內容和獲得的實際壓縮內容不匹配.幸運的是,這種情況隨著舊瀏覽器的使用者減少而減少. Apache的模塊可以通過自動添加適當的變化響應文件頭來解決這些問題.
MYSQL入門服務器會根據文件類型選擇gzip壓縮的內容,但一般情況下,服務器選擇壓縮的內容會過于局限.大部分網站會壓縮它們的Html文檔,而壓縮腳本和樣式表也是值得一做的,但很多網站并沒有這樣做,事實上,壓縮在包括 XML和JSON在內的任何文本響應都是值得的.圖片和PDF文件不應該被gzip壓縮,因為它們已經是被壓縮了的文件,gzip它們不僅浪費CPU甚至還有增大文件大小的可能.
MYSQL入門Gzip盡可能多的文件類型是減少頁面大小從而提高用戶體驗的一個簡單的方法.
MYSQL入門
5 把樣式表放在前面(Put Stylesheets at the Top)
MYSQL入門tag:css
MYSQL入門在研究Yahoo!的性能時,我們發現把樣式表挪到文檔的頭部可以讓頁面的加載顯得更快.因為把樣式表放在頭部可以讓頁面逐步呈現.
MYSQL入門關心網站性能的前臺工程師通常希望頁面能夠逐步加載;即,我們希望瀏覽器能夠把已經獲得的內容盡快展現.這對于內容很多的頁面以及網絡連接較慢的用戶尤為重要.給予用戶視覺上的反饋(比如進度提示)的重要性,已經經過了很詳盡的論證.而對于我們來說,Html 頁面本身就可以作為進度提示!當瀏覽器逐步加載頁面時,頭部、導航條、頂部的logo等等這些都可以作為對正在等待頁面的用戶的可視的反饋.而這會從整體上提高用戶體驗.
MYSQL入門把樣式表放在文檔的最后,會導致包括IE在內的大部分瀏覽器不進行逐步呈現.瀏覽器為了避免當樣式改變時重繪元素而中止呈現.用戶會十分無聊的看到一個空白的頁面.
MYSQL入門Html規范明確規定樣式表應該被包含在頁面的HEAD中:“和A不同,LINK只能在文檔的HEAD部位出現,但它可以出現多次.”空白的屏幕或者由于沒有應用樣式而引起的內容的閃現都不值得去嘗試.最好的方法是遵循HTML規范,把樣式表放在文檔的HEAD部位.
MYSQL入門?
6 把腳本放在最后(Put Scripts at the Bottom)
MYSQL入門tag:javascript
MYSQL入門腳本可能會堵塞并發的下載.HTTP/1.1規范建議瀏覽器在每個域名下只進行兩個并發下載.如果你把圖片放在多個域名下,可以實現多于兩個的并發下載.當腳本被下載時,即使使用不同的域名.瀏覽器也不會進行任何其它的下載.
MYSQL入門有些情況下把腳本放到底部并不太容易.比如,腳本使用了document.write 來添加部分頁面中的內容,就不能放到頁面中更后面的位置.還可能有作用域的問題.很多情況下,還有一些變通的方法.
MYSQL入門通常的建議是使用延遲腳本.DEFER屬性表明腳本不包含document.write,而且提示瀏覽器繼續展現.不幸的是,Firefox不支持DEFER屬性.IE中,腳本可以被延遲,但并不如你期望的那么久.如果一個腳本可以被延遲,那么它也可以被放在頁面的底部.這會讓你的頁面加載的更快.
MYSQL入門7 不使用CSS表達式 (Avoid CSS Expressions)
MYSQL入門tag:css
MYSQL入門?
MYSQL入門CSS表達式是一種有力的(同時也很危險的)動態設置CSS屬性的方法.從IE5開始支持CSS表達式.比如,使用CSS表達式可以實現背景顏色每小時變換的效果.
background-color: expression_r( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );
MYSQL入門如上所示,表達式方法采用了 Javascript的表達.CSS屬性則被設為Javascript表達式的結果.其它的瀏覽器會忽略CSS表達式,所以對于設置專屬IE的屬性以便在不同瀏覽器間能有一致的體驗是有用的.、
MYSQL入門而CSS表達式的問題是它比大多數人期望的執行次數更頻繁.表達式不僅僅在頁面展現和重新設置大小的時候執行,在頁面滾動,甚至用戶在頁面上挪動鼠標時都會執行.給CSS表達式添加一個計數器可以跟蹤CSS在什么時候和怎樣執行.在頁面上移動鼠標可以輕易的產生一萬次以上的執行.
MYSQL入門使用一次性的表達式是減少CSS表達式的執行次數的一個方法,當表達式第一次執行時,CSS表達式會被一個確定的值代替.如果在頁面生命周期中,樣式屬性必須動態的設定,使用事件處理替代CSS表達式是一個可選的方法.如果必須使用CSS表達式,要記得它們會執行上千次并影響頁面的性能.
MYSQL入門?
8 使用外部的JavaScript和CSS (Make JavaScript and CSS External)
MYSQL入門tag:javascript,css
MYSQL入門?
MYSQL入門很多性能規則都是解決怎樣處理獨立的組件的問題的.但是,考慮這些之前,你應該先考慮一個更基本的問題:JavaScript和CSS應該被放于外部的文件,還是內聯在頁面里?
MYSQL入門在實際應用中使用外部的文件往往產生更快的頁面,因為瀏覽器會緩存JavaScript和CSS文件.而內聯在頁面里的JavaScript和CSS會在每次哀求頁面時下載.這會減少所需的HTTP哀求數,但增大HTML文檔的體積.而另一方面,如果放在外部文件里的JavaScript和CSS被瀏覽器緩存,則既不用增加HTTP哀求的數量,HTML文檔的體積也會減少.
MYSQL入門關鍵的問題是,外部的JavaScript和CSS的組件被緩存的頻率和HTML文檔被哀求的次數相關.雖然很難去量化,但可以被用很多指標衡量.如果你的網站的用戶在每個會話中瀏覽了很多網頁而且很多頁面重用了相同的JavaSctipt和樣式表,緩存外部文件是有很大潛在的好處的.
MYSQL入門很多網站都符合這樣的指標.對于這些網站來說,最好的解決方案是把JavaScript和CSS發布為單獨的文件.唯一的例外,對于主頁,內聯的文件更好一些,例如 Yahoo!'s front page 和 My Yahoo!.主頁在每個會話中只有很少瀏覽(也許只有一次),你會發現內聯的 JavaScript和CSS會讓終端用戶的響應更快.
MYSQL入門對于有很多頁面瀏覽量的首頁來說,有很多能平衡內聯文件所提供的HTTP哀求減少的效果與外部文件緩存獲得的好處的技巧.一種這樣的技巧就是把JavaScript和CSS內聯在說夜里,但在頁面完成加載時動態下載外部文件.隨后的頁面會調用瀏覽器中已經緩存的外部文件.
MYSQL入門?
9 減少DNS的查詢 (Reduce DNS Lookups)
MYSQL入門tag:content
MYSQL入門?
MYSQL入門正如電話簿使人名和他們的電話號碼相對應,域名系統(DNS)能夠使域名和IP地址相對應.當你在瀏覽器中鍵入http://www.yahoo.com,瀏覽器鏈接的DNS解析器會返回服務器的 IP地址.域名解析會耗費一些時間,DNS查找給定域名的IP地址一般會耗費20-120毫秒.在DNS查找結束前,瀏覽器不會從目標域名那里下載任何東西.
MYSQL入門DNS查詢會被緩存以便優化性能.會有一個專門的緩存服務器進行緩存,用戶的ISP或者本地網絡會維護它,但獨立用戶的電腦里也會有緩存.DNS信息存在于操作系統的DNS緩存里(微軟Windows操作系統里的“DNS客戶服務”).大部分瀏覽器有它們自己的緩存,與操作系統的緩存相獨立.當瀏覽器在自己的緩存里保存了DNS的記錄,它不會向操作系統發出哀求記錄的要求.
MYSQL入門IE默認緩存DNS查詢30分鐘,在注冊表的DnsCacheTimeout的鍵值中設定.Firefox則緩存DNS查詢一分鐘,在配置network.dnsCacheExpiration 中設定.(Fasterfox 將它變為一小時.)
MYSQL入門當客戶端的DNS緩存被清空(包括瀏覽器和操作系統的緩存),DNS查詢的數量等同于網頁中單獨的域名的數量.包括頁面中的鏈接,圖片,腳本文件,樣式表,Flash對象等.減少不同域名的數量則會減少DNS查詢的數量.
MYSQL入門減少不同域名的數量可能減少頁面并行的下載數量.減少 DNS查詢縮短了響應時間,但減少了并行下載數也許會增加響應時間.我的建議是將組件分布在兩到四個域名之間.這能很好的折中減少DNS查詢提高的速度和維持較高水平的并行下載的效果.
MYSQL入門?
?10 縮小JavaScript和CSS (Minify JavaScript and CSS)
MYSQL入門tag:javascript,css
MYSQL入門?
MYSQL入門縮小是指從代碼中刪除不必要的字母,減少文件體積從而提高加載速度.縮減代碼時需要移除所有的注釋,以及不需要的空白(空格,新行和tab).這樣處理JavaScript之后,會由于下載文件的體積被減少而提高響應的性能.兩個常用的縮減JavaScript代碼的工具是JSMin 和YUI Compressor.YUI compressor也可以壓縮CSS.
MYSQL入門代碼混淆是另一個可用于源代碼的優化方案.它比壓縮更為復雜,而且在混淆的過程中更容易產生 Bug.縱觀U.S.的前十大網站,壓縮獲得了21%的體積減小而代碼混淆達到了25%.雖然代碼混淆的壓縮程度更高,但壓縮JavaScript的風險更小.
MYSQL入門不僅僅要壓縮外部的腳本和樣式表,內斂的<script>和<style>部分也可以而且應當被壓縮.即使你gzip了你的腳本和樣式,壓縮它們仍然能減少5%以上的體積.隨著JavaScript和CSS的應用和體積的增加,壓縮你的代碼獲得的收益也會越來越多.
MYSQL入門?
MYSQL入門?11 避免重定向 (Avoid Redirects)
MYSQL入門tag:content
MYSQL入門重定向結束于 301或302狀態碼.這里有一個301響應的HTTP頭的例子:
????? HTTP/1.1 301 Moved Permanently
????? Location: http://example.com/newuri
????? Content-Type: text/html
MYSQL入門瀏覽器會自動把用戶轉向Location域中指明的Url地址.HTTP頭里包含了重定向所需的所有信息.響應的主體一般是空的.301或者302響應都不會被實際緩存,除非添加額外的頭部,比如 Expires或者Cache- Control指明了它應該被緩存.meta refresh標簽和JavaScript也可以將用戶重定向到不同的URL,但如果你必須執行重定向,最好的方法是使用標準的3XX HTTP狀態代碼,以便使后退按鈕工作正常.
MYSQL入門需要謹記的是,重定向降低了用戶體驗.在用戶和HTML文檔之間插入的重定向延誤了頁面的呈現和組件下載,因為它們都不可能在獲得HTML文檔之前開始.
MYSQL入門?
MYSQL入門一種最浪費性能的重定向頻繁發生而網絡開發者們卻往往沒有意識到,那就是當地址中應當有一個左斜線(/)卻沒有的時候.比如,訪問http://astrology.yahoo.com/astrology會導致一個301效應并重定向到http://astrology.yahoo.com/astrology/(注意這里加了一個左斜線).在Apache中,這可以使用mod_rewrite,或者在Apache事件處理中使用DirectorySlash指令來修補.
MYSQL入門?
MYSQL入門使用重定向的另一個常見場景是連接舊網站和新網站.還包括連接網站的不同部分,或者在不同情況下(比如依據瀏覽器的類型,用戶的類型等)重定向用戶.使用重定向來連接兩個網站很簡單而且需要很少的額外代碼.雖然在這些情況下使用重定向減少了開發者的麻煩,但卻降低了用戶體驗.如果兩部分在同一個服務器上,可以使用Alias 和rewrite來替代重定向.如果域名變更引起了重定向,可以創建一個CNAME(一種可以創建一個別名使一個域名指向另一個的DNS記錄)結合 Alias 或者mod_rewrite來替代重定向.
MYSQL入門?
12 移除重復的腳本 (Remove Duplicate Scripts)
MYSQL入門tag:javascript
MYSQL入門?
MYSQL入門在同一個頁面中包含兩個相同的腳本文件降低了性能.這并不如你想象的那么罕見.在對美國十大網站中的檢查中,發現它們中的兩個包含了重復的腳本.有兩個主要因素增加了一個頁面包含兩個相同腳本的幾率――團隊的大小和腳本的數量.當腳本被重復包含時,由于增加了不必要的HTTP哀求和JavaScript的執行,影響了性能.
MYSQL入門不必要的HTTP哀求在IE中存在,而Firefox終沒有.在IE中,如果一個外部腳本被包含了兩次而且沒有被緩存,在頁面加載的過程中會產生兩次HTTP哀求.即使腳本被緩存了,當用戶重載頁面時,多余的HTTP哀求也會發生.
MYSQL入門產生多余的HTTP哀求的同時,多次執行腳本也會浪費時間.在Firefox和IE中,無論是否被緩存,腳本都會被重復執行.
MYSQL入門?
MYSQL入門避免腳本被意外加載兩次的一個方法是在你的模板系統中執行一個腳本管理模塊.通常的方式是在HTML頁面中使用SCRIPT標簽來添加一個腳本:
MYSQL入門
<script type="text/javascript" src="menu_1.0.17.js"></script>
MYSQL入門HP 中,可以選擇創建一個叫做insertScript的方法:
<?php insertScript("menu.js") ?>
MYSQL入門這個函數不僅僅能防止腳本被重復加載多次,還可以解決腳本的其他問題,比如獨立性檢測以及為腳本添加版本號碼以應對far future Expires頭部.
MYSQL入門?
13 設定ETags (Configure ETags)
MYSQL入門tag:server
MYSQL入門?
MYSQL入門實體標簽(ETags)是服務器和瀏覽器用于確定瀏覽器中緩存的組件和服務器中的是否對應的一種機制.("entity"是組件的另一種說法:圖片、腳本、樣式表等等)添加 ETags用于辨別組件提供了比單純利用“最后修改時間”更為靈活的機制.ETag是一個唯一標識組件的特定版本的字符串.它的唯一格式規范是字符串必須被引號引用.來源服務器使用ETag響應頭來設定一個組件的ETag:
MYSQL入門
????? HTTP/1.1 200 OK
????? Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
????? ETag: "10c24bc-4ab-457e1c1f"
????? Content-Length: 12195
MYSQL入門?
MYSQL入門當瀏覽器晚些時候需要檢測一個組件時,它使用If-None-Match 頭部把ETag傳回來源服務器.如果ETag匹配了,會返回一個304狀態碼,在這個例子里它會減少12195個字節的響應:
????? GET /i/yahoo.gif HTTP/1.1
????? Host: us.yimg.com
????? If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
????? If-None-Match: "10c24bc-4ab-457e1c1f"
????? HTTP/1.1 304 Not Modified
MYSQL入門?
MYSQL入門ETag的問題是它們往往在網站的一個服務器中被設為唯一的,當瀏覽器從一個服務器得到了組件并在稍后試圖到另一個服務器驗證時,ETag會不匹配,而這在使用多個服務器來處理哀求的網站中是很常見的.默認情況下,Apache和IIS在ETag中嵌入的數據戲劇性的減少了應用多臺服務器的網站的ETag驗證成功幾率.
MYSQL入門?
MYSQL入門Apache1.3和2.新版本的ETag格式是inode-size- timestamp.雖然一個給定的文件在多臺服務器中處于同一個目錄,而且有同樣的大小,權限,時間戳,但它的inode在不同服務器中是不同的.
MYSQL入門?
MYSQL入門IIS5.0和6.0有同樣的問題.IIS中ETag的格式是Filetimestamp:ChangeNumber. ChangeNumber用來跟蹤IIS配置的改變次數.一個網站的所有IIS不可能有相同的ChangeNumber.
MYSQL入門?
MYSQL入門這導致的結果是,Apache和IIS對完全相同的組件產生的ETag在不同服務器間不能匹配.如果ETags不匹配,用戶不會得到小而快的304響應,而是一個普通的200響應和組件的所有數據.如果你把你的網站放在了一個服務器里,這不會是一個問題.但如果你的網站有多臺服務器,而且你使用了Apache和IIS 默認的ETag配置,你的用戶會訪問頁面的速度會變慢,你的服務器加載的程度更高,消耗了更大的帶寬,代理服務器不能有效的緩存你的內容.即使你的組件有一個ar future Expires頭部,當用戶重載或者刷新頁面時,依然會發送一個GET哀求.
MYSQL入門?
MYSQL入門如果你不打算利用ETags提供的靈活的驗證模式,你最好把ETag統統移除.Last-Modified頭部的驗證方式給予組件的時間戳.移除ETag 同時減少響應和隨后的哀求中的HTTP頭部大小.這篇微軟的支持文檔描述了怎樣在IIS中移除 ETags.在Apache中,你只要在Apache配置文件中添加如下一行:
???? FileETag none
MYSQL入門?
MYSQL入門14 讓Ajax可以緩存 (Make Ajax Cacheable)
MYSQL入門tag:content
MYSQL入門Ajax 的好處之一是它能給用戶提供瞬間的響應,因為它從服務端異步哀求數據.但Ajax不能保證用戶在等候那些異步的JavaScript和XML響應返回時什么都不做.在應用程序中,用戶是否繼續等待取決于Ajax怎樣應用.比如,在一個基于Web的Email客戶端用戶會等候Ajax返回他們所搜索的郵件信息.記住異步并不代表“即刻”.
MYSQL入門為了提高性能,優化Ajax響應很重要.提高Ajax性能最重要的方式是使響應緩存,正如“添加一個過期期限和緩存控制頭”這一節討論的.這些原則同樣適用于Ajax.
MYSQL入門?
MYSQL入門??? * Gzip組件
??? * 減少DNS查詢
??? * 壓縮JavaScript
??? * 避免重定向
??? * 設定ETag
MYSQL入門?
MYSQL入門我們看一個例子.一個Web2,0的郵件客戶端可能會用Ajax自動下載用戶地址簿.如果用戶從上次使用郵件網站以來沒有修改她的地址簿,那么如果Ajax響應使用了長期失效時間或者緩存控制頭部,地址簿就可以從緩存中讀取出來.瀏覽器必須被告知“使用之前的緩存地址簿”而不是“哀求一個新的地址簿”.可以在地址簿Ajax的URL中添加一個標識用戶最后一次修改地址簿的時間戳,比如,&t=1190241612.如果地址簿從最后一次下載后沒有被更改,時間戳將相同而地址簿將會從瀏覽器的緩存中得到來替代額外的HTTP傳輸.如果用戶更改了她的地址簿,時間戳會保證新的URL不會和緩存中的匹配,而且瀏覽器會哀求會哀求更新的地址簿記錄.
MYSQL入門?
MYSQL入門即使你的Ajax響應時動態創建的,而且只適用于一個用戶,它們依然會被緩存.這樣做會讓你的Web2.0應用程序更快.
MYSQL入門?
15 更早的刷新緩沖區 (Flush the Buffer Early)
MYSQL入門tag:server
MYSQL入門當用戶哀求一個頁面,服務端會花費200至500毫秒的時間組合HTML頁面.在這期間,瀏覽器會靜靜等待數據到來.PHP中有flush()函數,它允許你向瀏覽器發送部分就緒的HTML響應,這樣瀏覽器可以在服務器處理余下的HTML頁面時去獲取組件.這樣的好處主要在忙碌的后臺和輕松的前臺間可以看到.
MYSQL入門?
MYSQL入門在HEAD后面是放置刷新操作的好地方,因為頭部的HTML代碼更容易產生,而且可以讓你放置任何CSS和JavaScript文件,以便瀏覽器在后臺工作依然進行時并行開始獲取組件.
MYSQL入門例子:
MYSQL入門... <!-- css, js -->
</head>
<?php flush(); ?>
<body>
... <!-- content -->
MYSQL入門Yahoo! search先行研究并且進行了真人測試證明了使用這項技術的好處.
MYSQL入門?
16 在Ajax哀求中使用GET方法 (Use GET for AJAX Requests)
MYSQL入門tag:server
MYSQL入門Yahoo! Mail 團隊發現進行XMLHttpRequest的時候,POST方法在瀏覽器中分兩步執行:先發送頭部,然后發送數據.所以最好使用只發送一個TCP包(除非你有很多的cookie)的GET方法.IE中URL的最大長度是2000,所以如果你發送超過 2000的數據就不能使用GET方法.
MYSQL入門?
MYSQL入門一個有趣的現象是,POST方法并不像GET那樣實際發送數據(而Get則名副其實).基于 HTTP規范,GET方法意味著取回數據,所以當你只是哀求數據時使用GET方法更為有意義(從語義上來說),而在發送需要儲存在服務器端的數據時則相反使用POST.
MYSQL入門
17 后加載組件 (Post-load Components)
MYSQL入門tag:content
MYSQL入門?
MYSQL入門你可以仔細端詳下你的頁面然后自問:“什么是在頁面初始化時必須的?”那么其余的內容和組件可以放在后面.
MYSQL入門?
MYSQL入門JavaScript是理想的用來分割onload事件之前和之后的選擇.例如你有執行拖放、下拉和動畫的JavaScript代碼和菜單,它們可以稍后加載,因為用戶在初始呈現之后才會在頁面上拖動元素.其他的可以被后加載的地方包括隱藏的內容(當用戶做某項操作才會展現的內容)和被折疊的圖片.
MYSQL入門?
MYSQL入門可以幫助你的工具有: YUI Image Loader能幫助你延緩加載折疊的圖片,而且YUI Get utility 能夠很簡單的包裝運行中的JS和CSS.比如,打開Firebug的網絡選項卡去查看Yahoo! Home Page.
MYSQL入門?
MYSQL入門當性能指標和其它網站開發的好的實踐一致時是不錯的.漸進增強的觀念告訴我們當支持JavaScript時,會提高用戶體驗,但你必須確保在沒有JavaScript時頁面也能工作.所以當你確保頁面工作正常時,你會通過延后加載的那些更花哨的腳本比如拖放和動畫,來增強你的頁面.
MYSQL入門?
MYSQL入門18 預先加載組件 (Preload Components)
MYSQL入門tag:content
MYSQL入門?
MYSQL入門預加載看起來和后加載原則是個矛盾,但它其實是為了另外一個目的.預加載組件讓你可以利用瀏覽器的空閑時間來加載之后需要的組件(比如圖片,樣式表和腳本).這樣當用戶瀏覽下一個頁面的時候,大部分組件都已經在緩存里了而頁面會加載的更快.
MYSQL入門?
MYSQL入門有幾種預加載的類型:
MYSQL入門?
MYSQL入門??? * 無條件預加載-當原本內容加載完成時,立刻開始獲取一些額外的組件.比如到google.com看下一個sprite圖片怎樣被在onload事件后哀求的.在google.com的首頁里并沒有用到sprite圖片,但被用在接下來的結果頁面里.
MYSQL入門
??? * 有條件的預加載-根據用戶的行為來猜測用戶什么時候到達下個頁面然后據此預加載.在search.yahoo.com上,你可以看到額外的組件在你在輸入框中輸入時是怎樣被加載的.
MYSQL入門
??? * 有預期的加載-當登錄重新設計的網站時進行加載.你通常會在重新設計網站后聽到:“新網站很酷,但它比以前的要慢”.這個問題的部分原因是用戶訪問舊網站時有所有的緩存,而對于新的來說,緩存是空的.你可以通過在登錄重新設計的網站前預加載一些組件來緩解這方面的影響.你的舊網站可以用瀏覽器空閑的時間來哀求新網站中用到的腳本和圖片.
MYSQL入門?
19 減小DOM元素的數量 (Reduce the Number of DOM Elements)
MYSQL入門tag:content
MYSQL入門?
MYSQL入門復雜的頁面意味著更多的字節需要被下載而且也意味著在JavaScript中遍歷DOM更慢.比如你在頁面中添加一個事件,讓它在500或者 5000個DOM元素中循環,它們的效率是不同的.
MYSQL入門?
MYSQL入門更多的DOM元素表明有些標簽需要被改良而并不一定需要移除實際內容.你是否為了布局而使用繁瑣的網一樣的表格?你是否只是為了彌補一些布局的問題而使用了更多的div標簽?也許還有更好和更符合語義的標簽可以使用.
MYSQL入門?
MYSQL入門?YUI CSS utilities可以很好的幫助進行布局:grid.css 可以幫助你進行所有的布局,front.css 和 reset.css 可以幫助你去除瀏覽器默認的格式.這是你開始重新審視你的標簽的機會,比如只在語義符合時使用div標簽,而不是用它來另起一行.
MYSQL入門?
MYSQL入門DOM 元素的數量很好檢測,只要在Firebug的控制臺里輸入:
document.getElementsByTagName_r('*').length
MYSQL入門?
MYSQL入門那么多少DOM元素算多呢?查看下類似的使用較好的標簽的頁面.比如Yahoo! Home Page是一個很豐富的頁面但只有700以下的DOM元素(HTML 標簽).
MYSQL入門?
MYSQL入門20 分域部署部件:Split Components Across Domains
MYSQL入門tag:內容
MYSQL入門將部件分割能使你獲得最大的并行下載效率.但你同時需要注意不使用多于2~4個域名,以避免DNS查詢導致的問題.例如,你可以將HTML內容和動態的組建放于 www.example.org域名下,將靜態組件分別放于static1.example.org和static2.example.org之下.
MYSQL入門?
MYSQL入門查看Tenni Theurer和Patty Chi的"Maximizing Parallel Downloads in the Carpool Lane"獲取更多關于并行下載的信息.
MYSQL入門?
21 減少Iframe的數量 Minimize the Number of iframes
MYSQL入門tag:內容
MYSQL入門?
MYSQL入門Iframes 能夠使HTML文檔被插入進父級文檔中.首先需要明確iframe的工作方式,才能有效的利用這一形式.
MYSQL入門?
MYSQL入門<iframe> 的優點:
MYSQL入門??? * 對于第三方內容,比如廣告,能夠在不影響父級設計的情況下快捷插入.
??? * 提供安全沙箱,不影響父級.
??? * 能夠并行下載腳本.
MYSQL入門?
MYSQL入門<iframe> 的缺點:
MYSQL入門??? * 即使是空的也會有消耗.
??? * 會鎖住頁面的onload事件.
??? * 不支持語義表達.
MYSQL入門?
22 避免404錯誤 No 404s
MYSQL入門tag:內容
MYSQL入門?
MYSQL入門一個獲得沒用的404響應的HTTP哀求對于寶貴的HTTP哀求資源來說是完全不必要的,而且這樣還會減慢用戶的體驗.
MYSQL入門?
MYSQL入門有的網站提供了有幫助的404錯誤信息,比如"你是否在尋找……?",這樣雖然能提高用戶體驗,但同樣浪費了服務端資源(比如數據庫).尤其不妙的是在哀求一個外部的Javascript腳本文件失敗時獲得的一個404錯誤,因為這樣不但會堵塞并行的下載,而且瀏覽器會嘗試分析404響應的內容,來辨識它是否是有用的Javascript代碼.
MYSQL入門?
23 減少Cookie的大小 Reduce Cookie Size
MYSQL入門tag:cookie
MYSQL入門?
MYSQL入門有多種理由讓我們應用HTTP cookie,比如身份驗證,或者個性化設置.Cookie中的信息在服務端和瀏覽器間被放在HTTP頭中交換.盡量減少cookie的體積對減少用戶獲得響應的時間十分重要.
MYSQL入門?
MYSQL入門查看Tenni Theurer和Patty Chi的"When the Cookie Crumbles"獲取更多信息.
MYSQL入門??? * 去除不必要的 cookie.
??? * 盡量減少cookie的大小.
??? * 留心將cookie設置在適當的域名下,避免影響到其他網站.
??? * 設置適當的過期時間.一個較早的過期時間或者不設置過期時間會更快的刪除cookie,從而減少用戶的響應時間.
MYSQL入門?
24 為部件使用沒有cookie的域名 Use Cookie-free Domains for Components
MYSQL入門tag:cookie
MYSQL入門?
MYSQL入門當瀏覽其哀求一個靜態圖片并一同發送cookie時,服務器并不需要這些cookie.這樣只是毫無益處的創建了多余的網絡流量.應當保證靜態的部件在哀求時沒有攜帶cookie,所以需要把你的靜態部件放在另一個子域名下.
MYSQL入門?
MYSQL入門如果你的域名是www.example.org,你可以將你的靜態部件放在static.example.org中.如果你把cookie設置在頂級域名example.org上而不是 www.example.org,那么所有發送至static.example.org的哀求會包括那些cookie.在這種情況下,你可以買一個全新的沒有cookie的域名來放置你的靜態部件.Yahoo!使用了yimg.com,YouTube試用了ytimg.com,Amazon使用的是 images-amazon.com.
MYSQL入門?
MYSQL入門將靜態部件放于沒有cookie的域名下的另一個好處是一些代理服務器會拒絕緩存有cookie 的部件.于此相關的一點是,如果你懷疑你應該為你的首頁使用example.org還是www.example.org,考慮cookie的贏下.省略 www會讓你不得不把cookie寫到*.example.org下,所以考慮性能,最好使用www.子域名,然后把cookie寫到這個子域名下.
MYSQL入門?
25 減少DOM的讀取 Minimize DOM Access
MYSQL入門tag:javascript?
MYSQL入門利用Javascript讀取 DOM元素很慢,所以為了獲得響應更快的頁面,你應該:
MYSQL入門??? * 緩存被讀取的元素的引用.
??? * 脫機更新節點然后把它們加回到樹結構中.
??? * 避免利用Javascript定位布局.
MYSQL入門?
MYSQL入門26 開發靈巧的事件處理程序 Develop Smart Event Handlers
MYSQL入門tag:javascript?
MYSQL入門如果有太多的事件處理邏輯部署在DOM樹的不同元素上,它們的頻繁執行會拖慢頁面的響應速度.而使用事件委托是一個好的解決方法.如果在一個Div中有10個按鈕,與其在每個按鈕上都放一個事件處理程序,步入只在Div上放一個事件處理程序.事件會冒泡上溯,這樣你就會捕獲這一事件,并找出是哪個按鈕發起的它.
MYSQL入門同樣,你并不需要等待onload事件來啟動一些操作DOM樹的程序.你只需要保證你需要操作的元素可用就可以了.你不需要等待所有的圖片下載完畢,你應當使用DOMContentLoaded事件來替代onload事件,當然,目前并不是所有瀏覽器都支持這一事件,你可以使用YUI Event組件,其中包含了一個onAvailable函數.
MYSQL入門查看Julien Lecomte的"High Performance Ajax Applications"獲取更多信息.
MYSQL入門?
27 選擇<link>而不是@import Choose <link> over @import
MYSQL入門tag:css?
MYSQL入門前面提到把CSS應當放在最頂端來提供預顯.在IE中,放在頁面底部的@import和<link>效果是一樣的,所以最好不要用它.
MYSQL入門?
28 不使用過濾器 Avoid Filters
MYSQL入門tag:css?
MYSQL入門IE專有的AlphaImageLoader過濾器是為了解決半透明真色PNG圖片在IE7之前的版本中顯示的問題.這個過濾器會在圖片下載時堵塞住展示.而且它會消耗內存并影響每個元素而不僅僅是每張圖片,所以這個過濾器的問題很多.?
MYSQL入門所以最好在IE中完全不使用AlphaImageLoader過濾器,而使用漸淡的 PNG8圖片.如果你明確需要AlphaImageLoader,請使用hack _filter,從而不影響到你的IE7+的用戶.
MYSQL入門?
29 優化圖片 Optimize Images
MYSQL入門tag:images?
MYSQL入門當設計師制作好網站的圖片后,還有些事情應該是你在把這些圖片上傳到服務器之前做的.
MYSQL入門??? * 你可以檢查GIF圖片中的調色板是否和圖片中的色彩數一致.使用imagemagick來幫助你方便的檢查:
????? identify -verbose image.gif
????? 如果你看到一個4色的圖片卻有一個256色的調色板,那么還有很大的空間來做性能優化.
??? * 試試把GIF轉換成PNG是否會節省空間,這是常有的事情.由于瀏覽器支持的限制,開發者往往懷疑是否該使用PNG,但這是過去的事情了.唯一的問題是真色的PNG圖片的半透明問題,但同樣,GIF不是真色的而且也不支持豐富的透明效果.所以GIF可以做的,PNG或者PNG8同樣可以做到(除了動畫).一條簡單的imagemagick語句就可以提供可用的PNG:
????? convert image.gif image.png
????? “我們強調的是,給PNG一個機會!”
??? * 使用pngcrush或者任何的PNG優化工具,例如:
????? pngcrush image.png -rem alla -reduce -brute result.png
??? * 使用 jpegtran處理JPEG圖片.這個工具會無損操作JPEG圖片,比如旋轉,而且可以用來優化圖片,比如去除圖片中的注釋和其他無用的信息(比如 EXIF信息).
????? jpegtran -copy none -optimize -perfect src.jpg dest.jpg
MYSQL入門?
30 優化CSS精靈 Optimize CSS Sprites
MYSQL入門tag:images
MYSQL入門??? * 橫向布局Sprite中的圖片往往比縱向布局會減少文件大小.
??? * 在一個Sprite中組合相近的顏色會降低顏色的數量,從而達到適合PNG8的低于256色的標準.
??? * “對移動設備友好”,不在Sprite里留下大的空隙.這并不十分影響文件的大小,但會減少客戶端代理將圖片解壓為像素映射的內存消耗,100*100的圖片是一萬像素,而1000*1000則是一百萬像素.
MYSQL入門?31 不要在HTML中縮放圖片 Don't Scale Images in HTML
MYSQL入門tag:images?
MYSQL入門不要使用大小超過需要的圖片,即使你能夠在HTML中設置它的屬性.如果你需要
MYSQL入門<img width="100" height="100" src="mycat.jpg" alt="My Cat" />
MYSQL入門那么就使用恰好100*100px的圖片,而不是使用縮放后的500*500的圖片.
MYSQL入門?
32 使用小的可緩存的Favicon.ico Make favicon.ico Small and Cacheable
MYSQL入門tag:images?
MYSQL入門favicon.icon是放在服務器根目錄的一個圖片,它是個麻煩卻不得不處理,因為即使你不關心,瀏覽器依然會哀求這張圖片,所以最好不要提供一個404的錯誤.而且由于它是在同一服務器下的,Cookie也會隨著每次哀求一并發送.這張圖片同樣干擾下載隊列,比如在IE中,當你在onload 事件中哀求額外的組件時,favicon會在這些額外組件之前下載.
MYSQL入門?所以為了減少favicon.ico的不利影響,我們應當:
MYSQL入門??? * 使用小圖片,小于1k為佳.
??? * 設置你認為合適的過期時間(因為你如果更新了圖片,你并不能修改它的名字).你可以設置過期為未來的幾個月.你可以借鑒下你當前的 favicon.ico的最后更新時間來作為設置依據.
MYSQL入門Imagemagick 能夠幫助你創建小圖片.
MYSQL入門?
33 保證組件大小小于25K Keep Components under 25K
MYSQL入門tag:mobile?
MYSQL入門這一限制是因為iPone不會緩存大于25K的組件,注意這里指的是未壓縮前的大小.這就是為什么縮小大小很重要,因為單單gzip并不足夠.?
MYSQL入門查看Wayne Shea和Tenni Theurer的"Performance Research, Part 5: iPhone Cacheability - Making it Stick"獲取更多信息.
MYSQL入門?
34 把組件打包進多部分文檔中 Pack Components into a Multipart Document
MYSQL入門tag:mobile?
MYSQL入門把組件打包進多部分文檔類似一封包含有附件的郵件,它能讓你通過一個HTTP哀求獲取多個組件(記住HTTP哀求是很昂貴的).當你使用這一技術,請先檢查客戶端是否支持它(iPone不支持).
《MYSQL數據庫網站前端和后臺性能優化的34條寶貴經驗和方法》是否對您有啟發,歡迎查看更多與《MYSQL數據庫網站前端和后臺性能優化的34條寶貴經驗和方法》相關教程,學精學透。維易PHP學院為您提供精彩教程。