<p id="xshpr"><strong id="xshpr"><menu id="xshpr"></menu></strong></p>
    <pre id="xshpr"></pre>
  1. 技術觀點

    加強技術投入,共享技術成果

    如何提高網站訪問速度 從30秒到3秒的改變


    編輯:杭州大顯網絡科技有限公司更新日期:2009-05-26
    2006年10月份,我開始對web開發產生了興趣,并決定自己也嘗試開發一個網站。在此之前,我做過3年的javaapplication的開發,對web開發應該算一無所知。在比較了java,php,ror,和python后,我選擇了基于python的web框架-django。到目前為止,我還認為這是一個明智的決定。Django高效的開發效率讓我僅僅用一個月的業余時間,就基本完成了網站的開發。這是一個網絡書簽的網站,我加上了一些有意思的特性,讓網站顯得有些與眾不同。

    我購買了域名和Dreamhost的主機空間。Dreamhost支持django,并且年的費用只有180元人民幣。2006年11月份,http://www.hpbookmarks.com上線了。網友們發來了善意的評論,“很有創意”,“點意思”,“一些feature很不錯”。同時,還有一個非常一致的意見就是,“訪問速度太慢了”。其實,當時的情況不只是訪問速度慢,而且是相當不穩定。很多時候是幾個小時網站無法訪問。當時,我并沒有在意,因為我有兩個自以為“合理”的解釋。,我用的是國外最便宜的虛擬主機,國內訪問慢是很正常的。第二,django的還處于0.95的狀態,效率和穩定性方面有問題也正常。

    但是,我慢慢發現上面的解釋不過是自己騙自己的借口。很多用dreamhost的網站,訪問起來也很快。而且django也已經被成功應用在許多大型的網站。我開始認真考慮提高網站速度的問題了。畢竟,速度慢的網站很可能在次就失去的用戶,他們可以永遠不會再來了。終于,我進行了下面一步一步的優化工作,并且取得了一個看起來還不錯的結果。

    步,用Ajax提高用戶體驗

    由于我的網站上鏈接字體的大小是根據點擊次數決定,所以每次點擊都要提交到服務器端并記錄次數,再在客戶端打開網站鏈接。這在localhost測試的時候沒有發現問題,但是部署到服務器上,會感到明顯的等待。解決辦法就是用Ajax。用戶點擊網站鏈接后就直接打開,再通過Ajax將點擊的事件提交到服務器端記錄。這樣用戶感覺不到任何延時。

    第二步,將邏輯移到客戶端的javascript中

    在開始的時候,“網站標簽高亮”和“手氣不錯”的功能都是提交到服務器端操作,然后返回結果的。后來,我發現其實很多邏輯是可以移到客戶端,由javascript來實現的。Javascript非常強大,可以完成很多復雜的邏輯。將邏輯移到客戶端的javascript中,可以很有效的減少和服務器通訊的次數,獲得更好的訪問速度。

    第三步,解決進程的

    由于采用的是fastCGI的方式,我配置了django.fcgi??墒?,我發現系統進程中,有大量的django.fcgi進程被標記為(失去功能)。這些進程會導致服務器有時無法正常訪問。我開始嘗試用命令來kill掉這些進程,但是很快發現這無法從根本上解決問題。后來,我看到一個老外在blog上提到一個解決方案,將django.fcgi改名為dispatch.fcgi。原來,dispatch.fcgi是一個dreamhost的系統進程,它的健壯性是可以得到保障的。果然,我將django.fcgi改名為dispatch.fcgi后,的現象再沒有出現。

    第四步,優化SQL語句

    SQL語句的執行通常也是一個很花費時間的操作。經過檢查,我發現我的一條SQL語句,是一個嵌套三層的子表查詢。而這條SQL還必須是一個RawSQL,即不能采用django的ORMaping。這意味著不能被cache緩存,每次都是真刀真槍的執行。更失敗的是,經過我的分析,這條SQL完全可以不執行。這是一次設計上的失誤,標
    準的overdesign(過渡設計)。當時,我是想通過數據庫得到一個最精確的統計值。后來發現,這個值完全可以用一個近似的常量代替。優化SQL,尤其是避免不必要的SQL執行,帶來的效果是非常明顯的。

    第五步,盡量減少頁面大小

    隨著添加網站越來越多,有一天我發現django生成的首頁已經達到了80k。我很清楚這是一個非常不能被接受的數字。我開始檢查頁面,很快發現了線索。,因為偷懶,頁面中很多layout是用空格()實現的。第二,因為為了增加代碼可讀行,調試方便,每行生成的頁面都增加換行符(\n)。第三,最糟糕的是,大量的用了
    波多野结衣无码

      <p id="xshpr"><strong id="xshpr"><menu id="xshpr"></menu></strong></p>
      <pre id="xshpr"></pre>