關(guān)于網(wǎng)站速度優(yōu)化的一點建議

前段時間做了一個PHP(TP框架)的項目,同時整合了Ucenter與Discuz論壇打通,實現(xiàn)了同步注冊與登錄,開發(fā)過程中遇到的各種問題,好在一一解決,結(jié)果最終上結(jié)之后出現(xiàn)了意想不到的情況,訪問速度奇慢,雖然當(dāng)時服務(wù)器配置低了些(windows server 2012 1核 2G 1M帶寬 phpstudy搭建的環(huán)境),但也不至于慢到如此地步,打開頁面都要卡三秒,而訪問論壇模塊的速度卻很快,于是在代碼中找各種原因,去除所有非必須的SQL、啟用GZIP壓縮、壓縮CSS/JS文件、啟用CSS/JS/Image文件緩存、均沒有太大的效果,只有在開啟了靜態(tài)頁面緩存之后速度才有了提升,靜態(tài)緩存是以空間換時間的一種方案,但也有一定的弊端,若公共頁面中包含用戶登錄相關(guān)信息,若設(shè)置的緩存有效期過長就會出現(xiàn)會員信息混亂的現(xiàn)在,即我的賬號登錄了個人中心,會出現(xiàn)別人的信息。這種方案適用于一些網(wǎng)站文章頁面及一些不常變化的頁面,而不適合于個人中心這類頁面。
解決了不常變化的頁面速度問題,接著就是解決個人中心這類每個人訪問頁面信息都不相同的頁面,在一些頁面上啟用了動態(tài)緩存這后第一次訪問速度依然很慢,而在第二次打開頁面時速度便有了明顯的提升,在沒有緩存的慢沖下再看打開鏈接的時間記錄,僅網(wǎng)站鏈接做出響應(yīng)所用的時間就占用了1S-2S的時間,于是將問題所在鎖定到數(shù)據(jù)庫上,在調(diào)整了所有的參數(shù)之后,速度依舊,嘗試服務(wù)器本地訪問速度依然不增,于是想到了配置文件,配置文件是在本地上傳后修改了服務(wù)器的用戶名和密碼直接使用的,與Ucenter及Discuz的配置文件數(shù)據(jù)庫鏈接部分對比,唯一的不同點就是ucenter與Discuz定義的host為127.0.0.1而TP網(wǎng)站定義的為localhost,在此之前看過一些文章也提過這種情況,說使用localhost與使用127.0.0.1在速度上的影響很大,于是我看了一下服務(wù)器的HOSTS文件,發(fā)現(xiàn)里面并沒有將localhost定向到127.0.0.1的本地回環(huán)地址,正是由于DNS解析的時間造成了服務(wù)器響應(yīng)慢的現(xiàn)象。這才找到真正的原因所在。將配置文件中的localhost換為127.0.0.1之后速度便恢復(fù)了正常。
在對網(wǎng)站的優(yōu)化過程中收集了各路大神以及官方資料,在此稍做整理。

1.網(wǎng)站響應(yīng)時間
網(wǎng)站響應(yīng)時間一般使用首字節(jié)到達(dá)時間來計算。
一般來說訪問網(wǎng)站是通過HTTP/HTTPS請求來完成的,HTTP協(xié)議是無狀態(tài)的,同一客戶端第二次訪問同一個服務(wù)器上的頁面時,服務(wù)器并不能通過訪問鏈接或協(xié)議得知該客戶端是否曾經(jīng)訪問過,這種不記錄狀態(tài)的方式使得服務(wù)器能支持大量的HTTP請求,HTTP是利用TCP協(xié)議來通過兩臺電腦之間的通訊的,而建立TCP連接需要經(jīng)過三次握手,關(guān)閉TCP連接需要四次握手,因此作為無狀態(tài)的HTTP連接來講,建立連接所花費的時間是很大的。HTTP1.0使用的是非持久連接,每次請求都要重新建立新的鏈接,這使得頁面下載變得很慢,同時也加重了網(wǎng)絡(luò)負(fù)擔(dān);而HTTP1.1開始使用KeepAlive持久連接的,即在一定的時間段內(nèi)保持連接,可以在一個連接中完成多次數(shù)據(jù)請求與響應(yīng),在這種情況下,服務(wù)器響應(yīng)完成后并不會直接關(guān)閉連接。這樣就減少了建立連接的次數(shù),節(jié)省一部分時間,同時減少帶寬的占用。
而要完成http請求,就需要DNS域名解析,DNS將域名解析成IP地址,再通過IP地址找到服務(wù)器,才能讓服務(wù)器做出響應(yīng)。一個快速的DNS解析服務(wù)器也是影響網(wǎng)站訪問速度的重要因素,DNS解析越短,服務(wù)器接收到請求越快。
因此網(wǎng)站的響應(yīng)時間(首字節(jié)時間)大致等于DNS解析的時間+TCP三次握手的時間+HTTP請求的時間+服務(wù)器處理響應(yīng)時間+響應(yīng)數(shù)據(jù)返回時間。
在這些因素中我們可以提高的有DNS解析時間,服務(wù)器處理時間。

2.優(yōu)化DNS解析
一般經(jīng)優(yōu)化的網(wǎng)站DNS解析的時間可以控制在200MS左右,若帶寬達(dá)到100M可以在50-100MS,對于DNS的優(yōu)化這里不做重點,主要通過幾個方面來控制:首先利用TTL,盡量讓用戶直接從運營商的DNS緩存中得到A記錄,其次選擇用戶量大服務(wù)面積廣的域名解析商;最后學(xué)會使用CNAME。

3.服務(wù)器處理時間
這里的服務(wù)器處理時間是我們主要要優(yōu)化的地方,服務(wù)器處理可優(yōu)化的地方主要包括:服務(wù)器硬件升級、服務(wù)器操作系統(tǒng)選擇、服務(wù)器環(huán)境工具的搭建、數(shù)據(jù)庫的優(yōu)化等
3.1 服務(wù)器硬件升級
首先硬件升級的效果是立竿見影的,主要包括CPU、內(nèi)存和帶寬,選擇一個適合自己的配置很重要。
3.2服務(wù)器操作系統(tǒng)的選擇
常見的服務(wù)器類型有windows系統(tǒng)和Linux/Unix系統(tǒng),其中Linux/Unix系統(tǒng)一般不安裝圖形界面,系統(tǒng)本身戰(zhàn)勝資源較少,一般通過命令行來管理,這就要求開發(fā)人員對基本的shell命令有所了解。而windows操作系統(tǒng)默認(rèn)是安裝了圖形界面的,系統(tǒng)占用的資源較大,同時其穩(wěn)定性較Linux/Unix差一些,宕機(jī)的可能性較大,但圖形界面管理比較容易。
如何選擇服務(wù)器操作系統(tǒng)要在滿足自身需求的同時考慮到環(huán)境是否真正適合自己。
3.3 服務(wù)器環(huán)境的搭建
環(huán)境的搭建與配置也十分重要,如果使用Linux系統(tǒng)可以搭建LAMP或者LNMP甚至LNAMP的環(huán)境,如果選擇windows系統(tǒng)則可以使用IIS或者另外搭建Apache/Nginx的服務(wù)環(huán)境,nginx的并發(fā)性較apache要好,而且節(jié)省資源,apache的rewrite穩(wěn)定性較nginx要好,而且模塊較多,一般來說需要性能則選擇nginx需要穩(wěn)定選擇apache.(觀點較為片面)
環(huán)境搭建的同時要考慮到影響網(wǎng)站訪問速度的一些配置信息,包括js/css緩存文件的配置,將不常修改的信息設(shè)定一個較長的緩存時間,這樣用戶二次訪問的時候不必再次請求相關(guān)文件,只需加載新的數(shù)據(jù)即可;配置GZIP壓縮,通過GZIP擴(kuò)展啟用GZIP壓縮可以將CSS/JS/IMAGE等較大的文件壓縮到較小的體積,減少帶寬的占用,提高訪問速度。
配置緩存,如memcache,Xcache, redis等。Thinkphp自帶S函數(shù)可實現(xiàn)動態(tài)緩存,這些緩存的配置最好在開發(fā)初期就考慮到使用哪種,以免后期添加對代碼的發(fā)動較大。
3.4 數(shù)據(jù)庫的優(yōu)化
避免開篇提到的那種情況 上線配置一定要定義為IP地址。
3.4.1 盡量使用存儲過程,存儲過程屬于預(yù)編譯語句,經(jīng)過一次編譯之后不需再次編譯,只要傳入相應(yīng)的字段值即可,減少了SQL語句編譯的過程。為常用操作添加存儲過程可減少大量SQL執(zhí)行時間,提高執(zhí)行效率。
3.4.2 為搜索字段建立索引,在有索引的情況下能大量減少查詢時間
3.4.3 盡可能使用NOT NULL來填充字段,并減少使用WHERE判斷NULL值。通過Mysql官方文檔得知NULL值要比正常值多占用1bit的存儲空間。
3.4.4 數(shù)據(jù)庫表的大字段剝離,保證單條記錄的數(shù)據(jù)量很小,可將表分區(qū)或拆分,將一些常用經(jīng)常更改的信息存放到一張表中,不常修改的信息存放到另外的表中,并減少JOIN語句的使用。
3.4.5 減少字段冗余。
3.4.6 可使用NoSQL
3.4.7 減少全局掃描
3.4.8 盡量避免or來連接條件,可使用UNION語句來代替
3.4.9 用exists代替In
3.4.10 避免使用游標(biāo)

3.5 PHP中需注意的幾點
3.5.1 用單引號包含字符要比雙引號快,用雙引號時PHP會搜索字段周圍的變量。
3.5.2 用foreach 代替for 或遍歷前計算好遍歷長度,避免每次都要計算。
3.5.3 地訪問鏈接若為目錄后面加上反斜杠"/",若不加反斜杠服務(wù)器會先判斷要訪問的是目錄還是文件,再定向到目錄下的index.php或index.html等文件中

3.6 前端需注意的幾點
3.6.1 減少頁面請求,合并CSS/JS文件,盡量將所有的CSS代碼放到一個CSS文件中,JS也是同理,上線后應(yīng)壓縮相關(guān)文件
3.6.2 將CSS放在頭部,JS放在尾部,在加載完樣式的前提下再去提高用戶體驗
3.6.3 使用CDN加速,對于常用的如JQuery等相關(guān)文件使用CDN加速
3.6.4 圖片盡量使用height width屬性,避免圖片加載完成后界面二次渲染
3.6.5 適當(dāng)使用AJAX,并不是AJAX使用越多越好,要根據(jù)實際情況選擇使用AJAX

附:apache開啟 GZIP 相關(guān)配置
http.conf文件中找到

LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so

去掉前面的#號,并在conf文件或.haccess文件中加入如下代碼

<IfModule mod_deflate.c>
DeflateCompressionLevel 6
SetOutputFilter DEFLATE 
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/x-javascript application/javascript application/json
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary #設(shè)置不對后綴gif,jpg,jpeg,png的圖片文件進(jìn)行壓縮
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary #同上,就是設(shè)置不對exe,tgz,gz。。。的文件進(jìn)行壓縮
SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary
AddOutputFilterByType DEFLATE text/* #設(shè)置對文件是文本的內(nèi)容進(jìn)行壓縮,例如text/html text/css text/plain等
AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript #這段代碼你只需要了解application/javascript application/x-javascript這段就可以了,這段的意思是對javascript文件進(jìn)行壓縮
AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp #這段是告訴apache對php類型的文件進(jìn)行壓縮
BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.x 有一些問題,所以只壓縮文件類型是text/html的
BrowserMatch ^Mozilla/4.0[678] no-gzip # Netscape 4.06-4.08 有更多的問題,所以不開啟壓縮
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html # IE瀏覽器會偽裝成 Netscape ,但是事實上它沒有問題
</IfModule>

apache 開啟圖片JS/CSS等文件緩存

加載mod_expires模塊,conf文件中找到如下代碼并去掉前面的#號

LoadModule deflate_module modules.so

在.haccess文件中加入如下代碼

<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A600
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A2592000
ExpiresByType text/css A604800
ExpiresByType image/gif A2592000
ExpiresByType image/png A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType text/plain A86400
ExpiresByType application/x-shockwave-flash A2592000
ExpiresByType video/x-flv A2592000
ExpiresByType application/pdf A2592000
ExpiresByType text/html A600
</IfModule>

關(guān)于memcached提供一個鏈接Install, configure, verify memcached on CentOS http://devdocs.magento.com/guides/v2.0/config-guide/memcache/memcache_centos.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,914評論 18 139
  • Yahoo!的Exceptional Performance團(tuán)隊為改善Web性能帶來最佳實踐。他們?yōu)榇诉M(jìn)行了一系列...
    拉風(fēng)的老衲閱讀 1,872評論 0 1
  • 網(wǎng)站優(yōu)化離不開前后端的互相協(xié)作,但是對于前端工程師來說,在保證后端技術(shù)方案不變時,能不能只利用前端技術(shù)來優(yōu)化網(wǎng)站呢...
    留七七閱讀 6,382評論 0 31
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,242評論 25 708
  • 趁著舍友差不多的時間過生日出去腐敗一下 哥倆好,打五折!吃完飯去樂購買面條和雞蛋,晚上回去準(zhǔn)備繼續(xù)high 招商引...
    李崇玉閱讀 182評論 1 1