網站訪問慢?如何優化網站訪問速度?

前段時間做了一個PHP(TP框架)的項目,同時整合了Ucenter與Discuz論壇打通,實現了同步註冊與登錄,開發過程中遇到的各種問題,好在一一解決,結果最終上結之後出現了意想不到的情況,訪問速度奇慢,雖然當時服務器配置低了些(windows server 2012 1核 2G 1M帶寬 phpstudy搭建的環境),但也不至於慢到如此地步,打開頁面都要卡三秒,而訪問論壇模塊的速度卻很快,於是在代碼中找各種原因,去除所有非必須的SQL、啓用GZIP壓縮、壓縮CSS/JS文件、啓用CSS/JS/Image文件緩存、均沒有太大的效果,只有在開啓了靜態頁面緩存之後速度纔有了提升,靜態緩存是以空間換時間的一種方案,但也有一定的弊端,若公共頁面中包含用戶登錄相關信息,若設置的緩存有效期過長就會出現會員信息混亂的現在,即我的賬號登錄了個人中心,會出現別人的信息。這種方案適用於一些網站文章頁面及一些不常變化的頁面,而不適合於個人中心這類頁面。

解決了不常變化的頁面速度問題,接着就是解決個人中心這類每個人訪問頁面信息都不相同的頁面,在一些頁面上啓用了動態緩存這後第一次訪問速度依然很慢,而在第二次打開頁面時速度便有了明顯的提升,在沒有緩存的慢衝下再看打開鏈接的時間記錄,僅網站鏈接做出響應所用的時間就佔用了1S-2S的時間,於是將問題所在鎖定到數據庫上,在調整了所有的參數之後,速度依舊,嘗試服務器本地訪問速度依然不增,於是想到了配置文件,配置文件是在本地上傳後修改了服務器的用戶名和密碼直接使用的,與Ucenter及Discuz的配置文件數據庫鏈接部分對比,唯一的不同點就是ucenter與Discuz定義的host爲127.0.0.1而TP網站定義的爲localhost,在此之前看過一些文章也提過這種情況,說使用localhost與使用127.0.0.1在速度上的影響很大,於是我看了一下服務器的HOSTS文件,發現裏面並沒有將localhost定向到127.0.0.1的本地迴環地址,正是由於DNS解析的時間造成了服務器響應慢的現象。這才找到真正的原因所在。將配置文件中的localhost換爲127.0.0.1之後速度便恢復了正常。

在對網站的優化過程中收集了各路大神以及官方資料,在此稍做整理。

1.網站響應時間

網站響應時間一般使用首字節到達時間來計算。

一般來說訪問網站是通過HTTP/HTTPS請求來完成的,HTTP協議是無狀態的,同一客戶端第二次訪問同一個服務器上的頁面時,服務器並不能通過訪問鏈接或協議得知該客戶端是否曾經訪問過,這種不記錄狀態的方式使得服務器能支持大量的HTTP請求,HTTP是利用TCP協議來通過兩臺電腦之間的通訊的,而建立TCP連接需要經過三次握手,關閉TCP連接需要四次握手,因此作爲無狀態的HTTP連接來講,建立連接所花費的時間是很大的。HTTP1.0使用的是非持久連接,每次請求都要重新建立新的鏈接,這使得頁面下載變得很慢,同時也加重了網絡負擔;而HTTP1.1開始使用KeepAlive持久連接的,即在一定的時間段內保持連接,可以在一個連接中完成多次數據請求與響應,在這種情況下,服務器響應完成後並不會直接關閉連接。這樣就減少了建立連接的次數,節省一部分時間,同時減少帶寬的佔用。

而要完成http請求,就需要DNS域名解析,DNS將域名解析成IP地址,再通過IP地址找到服務器,才能讓服務器做出響應。一個快速的DNS解析服務器也是影響網站訪問速度的重要因素,DNS解析越短,服務器接收到請求越快。

因此網站的響應時間(首字節時間)大致等於DNS解析的時間+TCP三次握手的時間+HTTP請求的時間+服務器處理響應時間+響應數據返回時間。 

在這些因素中我們可以提高的有DNS解析時間,服務器處理時間。

2.優化DNS解析

一般經優化的網站DNS解析的時間可以控制在200MS左右,若帶寬達到100M可以在50-100MS,對於DNS的優化這裏不做重點,主要通過幾個方面來控制:首先利用TTL,儘量讓用戶直接從運營商的DNS緩存中得到A記錄,其次選擇用戶量大服務面積廣的域名解析商;最後學會使用CNAME。

3.服務器處理時間

這裏的服務器處理時間是我們主要要優化的地方,服務器處理可優化的地方主要包括:服務器硬件升級、服務器操作系統選擇、服務器環境工具的搭建、數據庫的優化等

        3.1 服務器硬件升級

首先硬件升級的效果是立竿見影的,主要包括CPU、內存和帶寬,選擇一個適合自己的配置很重要。

3.2服務器操作系統的選擇

常見的服務器類型有windows系統和Linux/Unix系統,其中Linux/Unix系統一般不安裝圖形界面,系統本身戰勝資源較少,一般通過命令行來管理,這就要求開發人員對基本的shell命令有所瞭解。而windows操作系統默認是安裝了圖形界面的,系統佔用的資源較大,同時其穩定性較Linux/Unix差一些,宕機的可能性較大,但圖形界面管理比較容易。

如何選擇服務器操作系統要在滿足自身需求的同時考慮到環境是否真正適合自己。

3.3 服務器環境的搭建

環境的搭建與配置也十分重要,如果使用Linux系統可以搭建LAMP或者LNMP甚至LNAMP的環境,如果選擇windows系統則可以使用IIS或者另外搭建Apache/Nginx的服務環境,nginx的併發性較apache要好,而且節省資源,apache的rewrite穩定性較nginx要好,而且模塊較多,一般來說需要性能則選擇nginx需要穩定選擇apache.(觀點較爲片面)

環境搭建的同時要考慮到影響網站訪問速度的一些配置信息,包括js/css緩存文件的配置,將不常修改的信息設定一個較長的緩存時間,這樣用戶二次訪問的時候不必再次請求相關文件,只需加載新的數據即可;配置GZIP壓縮,通過GZIP擴展啓用GZIP壓縮可以將CSS/JS/IMAGE等較大的文件壓縮到較小的體積,減少帶寬的佔用,提高訪問速度。

配置緩存,如memcache,Xcache, redis等。Thinkphp自帶S函數可實現動態緩存,這些緩存的配置最好在開發初期就考慮到使用哪種,以免後期添加對代碼的發動較大。

3.4 數據庫的優化

避免開篇提到的那種情況 上線配置一定要定義爲IP地址。

3.4.1 儘量使用存儲過程,存儲過程屬於預編譯語句,經過一次編譯之後不需再次編譯,只要傳入相應的字段值即可,減少了SQL語句編譯的過程。爲常用操作添加存儲過程可減少大量SQL執行時間,提高執行效率。

3.4.2 爲搜索字段建立索引,在有索引的情況下能大量減少查詢時間

3.4.3 儘可能使用NOT NULL來填充字段,並減少使用WHERE判斷NULL值。通過Mysql官方文檔得知NULL值要比正常值多佔用1bit的存儲空間。

3.4.4 數據庫表的大字段剝離,保證單條記錄的數據量很小,可將表分區或拆分,將一些常用經常更改的信息存放到一張表中,不常修改的信息存放到另外的表中,並減少JOIN語句的使用。

3.4.5 減少字段冗餘。

3.4.6 可使用NoSQL

3.4.7 減少全局掃描

        3.4.8 儘量避免or來連接條件,可使用UNION語句來代替

3.4.9 用exists代替In

3.4.10 避免使用遊標


3.5 PHP中需注意的幾點

3.5.1 用單引號包含字符要比雙引號快,用雙引號時PHP會搜索字段周圍的變量。

3.5.2 用foreach 代替for 或遍歷前計算好遍歷長度,避免每次都要計算。

3.5.3 地訪問鏈接若爲目錄後面加上反斜槓"/",若不加反斜槓服務器會先判斷要訪問的是目錄還是文件,再定向到目錄下的index.php或index.html等文件中


3.6 前端需注意的幾點

3.6.1 減少頁面請求,合併CSS/JS文件,儘量將所有的CSS代碼放到一個CSS文件中,JS也是同理,上線後應壓縮相關文件

3.6.2 將CSS放在頭部,JS放在尾部,在加載完樣式的前提下再去提高用戶體驗

3.6.3 使用CDN加速,對於常用的如JQuery等相關文件使用CDN加速

3.6.4 圖片儘量使用height width屬性,避免圖片加載完成後界面二次渲染

3.6.5 適當使用AJAX,並不是AJAX使用越多越好,要根據實際情況選擇使用AJAX

附:apache開啓 GZIP 相關配置

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 #設置不對後綴gif,jpg,jpeg,png的圖片文件進行壓縮
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary #同上,就是設置不對exe,tgz,gz。。。的文件進行壓縮
SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary
AddOutputFilterByType DEFLATE text/* #設置對文件是文本的內容進行壓縮,例如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文件進行壓縮
AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp #這段是告訴apache對php類型的文件進行壓縮
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/<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px;">mod_expires</span>.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>

關於memcached提供一個鏈接 Install, configure, verify memcached on CentOS
--------------------- 
作者:Eric__Cui 
來源:CSDN 
原文:https://blog.csdn.net/eric__cui/article/details/52918160 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

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