《構建高性能Web站點》第五章 第六章 第七章

包括:《構建高性能Web站點》第五章 動態腳本加速 第六章 瀏覽器緩存 第七章Web服務器緩存

動態腳本加速

1.opcode緩存

PHP、Ruby、Python,它們都屬於解釋型語言,所以用它們編寫的動態內容都需要依賴相應的解釋器程序來運行。
解釋器程序也是一個二進制可執行文件,比如/bin/ruby,它同樣可以直接在進程中運行,在運行過程中,解釋器程序需要對輸入的腳本代碼進行分析,領會它們的旨意,然後執行它們。

編譯型語言和解釋型語言:
https://blog.csdn.net/u014647208/article/details/78329187
https://blog.csdn.net/u010830004/article/details/78282070

概括來說:
編譯型語言翻譯只做了一次,運行時不需要翻譯,所以編譯型語言的程序執行效率高,但也不能一概而論,部分解釋型語言的解釋器通過在運行時動態優化代碼,甚至能夠使解釋型語言的性能超過編譯型語言。
解釋型語言在運行的時候才翻譯,比如VB語言,在執行的時候,專門有一個解釋器能夠將VB語言翻譯成機器語言,每個語句都是執行的時候才翻譯。這樣解釋型語言每執行一次就要翻譯一次,效率比較低。

解釋器完成對腳本代碼的分析後,便將它們生成可以直接運行的中間代碼,也稱爲操作碼(Operate Code, opcode)。

從程序代碼到中間代碼的這個過程,我們稱爲解釋(parse),它由解釋器來完成。與此相似的是,編譯型語言中的編譯器(如C語言的編譯器gcc),也要將程序代碼生成中間代碼,這個過程我們稱爲編譯(compile)。

編譯器和解釋器的一個本質不同在於,解釋器在生成中間代碼後,便直接執行它,所以運行時的控制權在解釋器;而編譯器則將中間代碼進一步優化,生成可以直接運行的目標程序(例如exe),但不執行它,用戶可以在隨後的任意時間執行它,這時控制權在目標程序,和編譯器沒有任何關係。

正是因爲解釋器每次運行的時候都將腳本代碼作爲輸入數據來分析,所以它的數據結構可以動態改變,這使得解釋型語言具備了很多豐富的動態特性,在開發和調試中有很多優勢,特別是一些流行的Web開發框架,其中的一些特性如果沒有動態語言的支持是無法實現的。

opcode緩存器擴展,比如APC、eAccelerator、XCache等。

2.解釋器擴展模塊

3.腳本跟蹤與分析

我們需要了解如何測量腳本程序中各處代碼的執行時間,爲此,代碼跟蹤是少不了的,我們必須掌握腳本的高級調試技巧,幾乎所有腳本語言都內置了或多或少的調式方法,但是也許它們並不專業,而且不夠完整。

==瀏覽器緩存 ==

1.別忘了瀏覽器

如果你換一個角度,把瀏覽器想象成爲Web站點分派到千家萬戶的緩存管理器,那麼從現在開始,你不能再對瀏覽器坐視不理了。

聽起來非常不錯,這似乎告訴我們應該把握一個原則,儘可能地讓Web站點的內容緩存在用戶瀏覽器中,這樣將在一定程度上減少了服務器的計算開銷,而且也避免了有些內容由於不必要的重複傳輸而帶來的帶寬浪費。

2.緩存協商

緩存內容存儲在瀏覽器本地,而內容由Web服務器生成,任何一方都不可能獨立完成這一系列過程,所以它們之間必須有一種溝通機制,這就是HTTP中的“緩存協商”。

協商的過程很容易理解,首先,當瀏覽器向Web服務器請求一些內容時,Web服務器需要告訴瀏覽器哪些內容可以被緩存,一旦瀏覽器知道某個內容可以緩存後,下次當瀏覽器需要請求這個內容時,它便不會直接向服務器請求完整內容,而是詢問服務器是否可以使用本地的緩存,服務器在收到瀏覽器的詢問後需要作出果斷的迴應,到底是允許瀏覽器使用本地緩存還是將最新的內容傳回瀏覽器。

協商方式:
1.If-Modified-Since與Last-Modified
2.Etag和If-None-Match

3.徹底消滅請求

HTTP中還有另一個標記,那就是Expires,它告訴瀏覽器該內容在何時過期,暗示瀏覽器在該內容過期之前不需要再詢問服務器,而直接使用本地緩存即可。

這樣的好處顯而易見,一旦瀏覽器絲毫不用請求服務器,那將完全節省了帶寬和服務器處理等開銷,可謂皆大歡喜。

Expires標記更像善於放權的管理者,瀏覽器一旦看到某個內容附帶Expires標記後,便擁有了極大的權力,它無須在過期之前每次都詢問服務器,完全可以自作主張,而Last-Modified標記讓瀏覽器感到拘束,它們不得不每次都詢問服務器,即便它們認爲這樣做毫無意義。

Web服務器緩存

1.URL映射

對於任何Web服務器,當我們向它發送一個HTTP請求後,它要做的主要工作就是解析URL,然後完成從URL到實際內容或資源的映射。這裏所說的映射是一個抽象的概念,實際上就是服務器處理請求並生成響應內容的過程,而這裏之所以說“映射”,是希望從URL的角度來看服務器的處理過程。

如果我們不看過程,只關注URL和最終的響應內容,則它們確實就像一系列的對應關係。這個過程可以是重定向、代理等。

2.緩存響應內容

3.緩存文件描述符

對於靜態內容,特別是擁有大量小文件的站點,Web服務器相當大的一部分開銷花在了打開文件上,即open()系統調用,所以我們還可以考慮將打開後的文件描述符直接緩存到Web服務器的內存中,當然,文件描述符是反映系統資源的數據結構,它也只能存在於本機內存中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章