2023-12-04 分類: 網(wǎng)站建設(shè)
如何提高網(wǎng)站訪問速度
2006年10月份,我開始對(duì)web開發(fā)產(chǎn)生了興趣,并決定自己也嘗試開發(fā)一個(gè)網(wǎng)站。在此之前,我做過3年的java application的開發(fā),對(duì)web開發(fā)應(yīng)該算一無所知。在比較了java,php,ror,和python后,我選擇了基于python的web框架 - django 。到目前為止,我還認(rèn)為這是一個(gè)明智的決定。Django高效的開發(fā)效率讓我僅僅用一個(gè)月的業(yè)余時(shí)間,就基本完成了網(wǎng)站的開發(fā)。這是一個(gè)網(wǎng)絡(luò)書簽的網(wǎng)站,我加上了一些有意思的特性,讓網(wǎng)站顯得有些與眾不同。
我購(gòu)買了域名和Dreamhost 的主機(jī)空間。Dreamhost支持django,并且第一年的費(fèi)用只有180元人民幣。2006年11月份,http://www.hpbookmarks.com 上線了。網(wǎng)友們發(fā)來了善意的評(píng)論,“很有創(chuàng)意”,“點(diǎn)意思”,“一些feature很不錯(cuò)”。同時(shí),還有一個(gè)非常一致的意見就是,“訪問速度太慢了”。其實(shí),當(dāng)時(shí)的情況不只是訪問速度慢,而且是相當(dāng)不穩(wěn)定。很多時(shí)候是幾個(gè)小時(shí)網(wǎng)站無法訪問。當(dāng)時(shí),我并沒有在意,因?yàn)槲矣袃蓚€(gè)自以為“合理”的解釋。第一,我用的是國(guó)外最便宜的虛擬主機(jī),國(guó)內(nèi)訪問慢是很正常的。第二,django的還處于0.95的狀態(tài),效率和穩(wěn)定性方面有問題也正常。
但是,我慢慢發(fā)現(xiàn)上面的解釋不過是自己騙自己的借口。很多用dreamhost的網(wǎng)站,訪問起來也很快。而且django也已經(jīng)被成功應(yīng)用在許多大型的網(wǎng)站。我開始認(rèn)真考慮提高網(wǎng)站速度的問題了。畢竟,速度慢的網(wǎng)站很可能在第一次就失去的用戶,他們可以永遠(yuǎn)不會(huì)再來了。終于,我進(jìn)行了下面一步一步的優(yōu)化工作,并且取得了一個(gè)看起來還不錯(cuò)的結(jié)果。
第一步,用Ajax提高用戶體驗(yàn)
由于我的網(wǎng)站上鏈接字體的大小是根據(jù)點(diǎn)擊次數(shù)決定,所以每次點(diǎn)擊都要提交到服務(wù)器端并記錄次數(shù),再在客戶端打開網(wǎng)站鏈接。這在localhost測(cè)試的時(shí)候沒有發(fā)現(xiàn)問題,但是部署到服務(wù)器上,會(huì)感到明顯的等待。解決辦法就是用Ajax。用戶點(diǎn)擊網(wǎng)站鏈接后就直接打開,再通過Ajax將點(diǎn)擊的事件提交到服務(wù)器端記錄。這樣用戶感覺不到任何延時(shí)。
第二步,將邏輯移到客戶端的javascript中
在開始的時(shí)候,“網(wǎng)站標(biāo)簽高亮”和“手氣不錯(cuò)”的功能都是提交到服務(wù)器端操作,然后返回結(jié)果的。后來,我發(fā)現(xiàn)其實(shí)很多邏輯是可以移到客戶端,由 javascript來實(shí)現(xiàn)的。Javascript非常強(qiáng)大,可以完成很多復(fù)雜的邏輯。將邏輯移到客戶端的javascript中,可以很有效的減少和服務(wù)器通訊的次數(shù),獲得更好的訪問速度。
第三步,解決進(jìn)程的
由于采用的是fastCGI的方式,我配置了django.fcgi。可是,我發(fā)現(xiàn)系統(tǒng)進(jìn)程中,有大量的django.fcgi進(jìn)程被標(biāo)記為 < defunct>(失去功能)。這些進(jìn)程會(huì)導(dǎo)致服務(wù)器有時(shí)無法正常訪問。我開始嘗試用命令來kill掉這些進(jìn)程,但是很快發(fā)現(xiàn)這無法從根本上解決問題。后來,我看到一個(gè)老外在blog上提到一個(gè)解決方案,將django.fcgi改名為dispatch.fcgi。原來,dispatch.fcgi是一個(gè)dreamhost的系統(tǒng)進(jìn)程,它的健壯性是可以得到保障的。果然,我將django.fcgi改名為 dispatch.fcgi后,的現(xiàn)象再?zèng)]有出現(xiàn)。
第四步,優(yōu)化SQL語句
SQL語句的執(zhí)行通常也是一個(gè)很花費(fèi)時(shí)間的操作。經(jīng)過檢查,我發(fā)現(xiàn)我的一條SQL語句,是一個(gè)嵌套三層的子表查詢。而這條SQL還必須是一個(gè)Raw SQL,即不能采用django的OR Maping。這意味著不能被cache緩存,每次都是真刀真槍的執(zhí)行。更失敗的是,經(jīng)過我的分析,這條SQL完全可以不執(zhí)行。這是一次設(shè)計(jì)上的失誤,標(biāo)
準(zhǔn)的over design(過渡設(shè)計(jì))。當(dāng)時(shí),我是想通過數(shù)據(jù)庫得到一個(gè)最精確的統(tǒng)計(jì)值。后來發(fā)現(xiàn),這個(gè)值完全可以用一個(gè)近似的常量代替。優(yōu)化SQL,尤其是避免不必要的SQL執(zhí)行,帶來的效果是非常明顯的。
第五步,盡量減少頁面大小
隨著添加網(wǎng)站越來越多,有一天我發(fā)現(xiàn)django生成的首頁已經(jīng)達(dá)到了80k。我很清楚這是一個(gè)非常不能被接受的數(shù)字。我開始檢查頁面,很快發(fā)現(xiàn)了線索。 第一,因?yàn)橥祽校撁嬷泻芏鄉(xiāng)ayout是用空格( )實(shí)現(xiàn)的。第二,因?yàn)闉榱嗽黾哟a可讀行,調(diào)試方便,每行生成的頁面都增加換行符 (\n)。第三,最糟糕的是,大量的用了
inline css。就是將css style直接嵌入標(biāo)記塊中。于是,我立即動(dòng)手,用css的align解決layout,去掉\n,將inline css抽象到獨(dú)立的css文件中。這樣下來,在不更改任何內(nèi)容的情況下,80k變成了57k。(補(bǔ)充:由于網(wǎng)站鏈接大部分是打開新窗口,所以用了大量的 target=_blank。在ylsdd的提示下,在html的head里增加了,又節(jié)約了4k。)
第六步,用gzip進(jìn)行頁面壓縮
當(dāng)我興高采烈的把頁面優(yōu)化結(jié)果貼到了smth bbs上,卻被直接潑了盆涼水。原來百分之二十幾的優(yōu)化結(jié)果,實(shí)在太一般了。ylsdd給我了一個(gè)很重要的線索,deflate。原來apache的 deflate模塊可以把文件進(jìn)行g(shù)zip壓縮,壓縮后的文件傳到瀏覽器后再被解壓。主流的瀏覽器都支持這種gzip的解壓操作。于是,我在apache 的配置文
件中加入了Add Output
網(wǎng)站名稱:如何提高網(wǎng)站訪問速度
網(wǎng)頁網(wǎng)址:http://m.newbst.com/news33/298883.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、標(biāo)簽優(yōu)化、面包屑導(dǎo)航、域名注冊(cè)、網(wǎng)站導(dǎo)航、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容