網站性能優化對於大型網站來講很是重要,一個網站的訪問打開速度影響着用戶體驗度,網站訪問速度慢會形成高跳出率,小網站很好解決,那對於大型網站因爲欄目多,圖片和圖像都比較龐大,那該怎麼進行總體性能優化呢?本文爲你提供一份大型php網站性能和併發訪問優化方案.php
1、大型網站性能提升策略:html
大型網站,好比門戶網站,在面對大量用戶訪問、高併發請求方面,基本的解決方案集中在這樣幾個環節:使用高性能的服務器、高性能的數據庫、高效率的編程語言、還有高性能的Web容器。這幾個解決思路在必定程度上意味着更大的投入。前端
web容器是一種服務程序,在服務器一個端口就有一個提供相應服務的程序,而這個程序就是處理從客戶端發出的請求,如JAVA中的Tomcat容器,ASP的IIS或PWS都是這樣的容器。一個服務器能夠多個容器。web
一、HTML靜態化正則表達式
其實你們都知道,效率最高、消耗最小的就是純靜態化的html頁面,因此咱們儘量使咱們的網站上的頁面採用靜態頁面來實現,這個最簡單的方法其實也是最有效的方法。thinkphp
二、圖片服務器分離數據庫
你們知道,對於Web服務器來講,無論是Apache、IIS仍是其餘容器,圖片是最消耗資源的,因而咱們有必要將圖片與頁面進行分離,這是基本上大型網站都會採用的策略,他們都有獨立的、甚至不少臺的圖片服務器。這樣的架構能夠下降提供頁面訪問請求的服務器系統壓力,而且能夠保證系統不會由於圖片問題而崩潰。apache
在應用服務器和圖片服務器上,能夠進行不一樣的配置優化,好比apache在配置ContentType的時候能夠儘可能少支持、儘量少的LoadModule,保證更高的系統消耗和執行效率。編程
三、數據庫集羣、庫表散列後端
大型網站都有複雜的應用,這些應用必須使用數據庫,那麼在面對大量訪問的時候,數據庫的瓶頸很快就能顯現出來,這時一臺數據庫將很快沒法知足應用,因而咱們須要使用數據庫集羣或者庫表散列。
在數據庫集羣方面,不少數據庫都有本身的解決方案,經常使用的MySQL提供的Master/Slave也是相似的方案。
集羣一般會使用CDN與GSBL與DNS負載均衡技術,每一個地區一組前臺服務器羣,例如:網易,百度使用了DNS負載均衡技術,每一個頻道一組前臺服務器,一搜使用了DNS負載技術,全部頻道共用一組前臺服務器集羣。
庫表散列是經常使用而且最有效的解決方案。
咱們在應用程序中安裝業務和應用或者功能模塊將數據庫進行分離,不一樣的模塊對應不一樣的數據庫或者表,再按照必定的策略對某個頁面或者功能進行更小的數據庫散列,好比用戶表,按照用戶ID進行表散列,這樣就可以低成本的提高系統的性能而且有很好的擴展性。
sohu的論壇就是採用了這樣的架構,將論壇的用戶、設置、帖子等信息進行數據庫分離,而後對帖子、用戶按照板塊和ID進行散列數據庫和表,最終能夠在配置文件中進行簡單的配置便能讓系統隨時增長一臺低成本的數據庫進來補充系統性能。
四、緩存
緩存一詞搞技術的都接觸過,不少地方用到緩存。網站架構和網站開發中的緩存也是很是重要。這裏先講述最基本的兩種緩存。高級和分佈式的緩存在後面講述。
架構方面的緩存,對Apache比較熟悉的人都能知道Apache提供了本身的緩存模塊,也可使用外加的Squid模塊進行緩存,這兩種方式都可以有效的提升Apache的訪問響應能力。
網站程序開發方面的緩存,Linux上提供的Memory Cache是經常使用的緩存接口,能夠在web開發中使用,好比用Java開發的時候就能夠調用MemoryCache對一些數據進行緩存和通信共享,一些大型社區使用了這樣的架構。另外,在使用web語言開發的時候,各類語言基本都有本身的緩存模塊和方法,PHP有Pear的Cache模塊,Java就更多了,.net不是很熟悉,相信也確定有。
五、鏡像
鏡像是大型網站常採用的提升性能和數據安全性的方式,鏡像的技術能夠解決不一樣網絡接入商和地域帶來的用戶訪問速度差別,好比ChinaNet和EduNet之間的差別就促使了不少網站在教育網內搭建鏡像站點,數據進行定時更新或者實時更新。
六、負載均衡
負載均衡將是大型網站解決高負荷訪問和大量併發請求採用的高端解決辦法。
負載均衡技術發展了多年,有不少專業的服務提供商和產品能夠選擇,我我的接觸過一些解決方法,其中有兩個架構能夠給你們作參考
2、PHP代碼編寫優化:
1. echo比print要快不少。
兩個方法都會在頁面上打印東西,不過echo不返回任何值,print會在成功或失敗的時候返回0或1。
2. include_once比include更加耗時。
由於它須要去檢查你要包含的class是否已經被包含進來。
3. 對於長段落的字符串必定要使用單引號,而不是雙引號。
由於雙引號會去搜索字符串中的變量。好比:echo ‘This is long string’.$name就比echo 「This is long string $name」要快不少。
4. 不要再循環中嵌套使用for循環
5. 若是能將函數定義爲靜態的
那麼就不要定義成爲成員函數,靜態函數比成員函數快33%。
6. 若是你能夠不經過正則表達式就能解決問題
那麼就別用正則。正則表達式比PHP原生的函數要慢一些。
例如使用str_replace取代preg_replae。
7. 儘可能不要使用相對路徑來包含文件
在相對路徑中查找文件,會如今當前目錄中查找,而後依次再查找。這樣查找文件就很 慢。最好是先定義WEB_ROOT這樣的常量,而後使用這個常量來包含文件。
8. 全等符號===比相等==要快
並且if(1 == ’1′)會返回true,if(0 == 」)也會返回true,而當你使用全等符號的時候if(1 ===’1′)和if(0===」)都會返回false。因此當你在程序中須要檢測一些布爾變量 的時候最好使用全等符號。
3、針對thinkphp 有如下幾種方式
1. 關閉調試模式
因爲關閉調試模式以後,系統會自動生成項目編譯緩存以及關閉日誌寫 入,這樣能夠減小不少的IO加載和日誌寫入的開銷。
2. 開啓頁面壓縮輸出
3.1版本開始,增長了OUTPUT_ENCODE配置參數,用於控制頁面壓縮輸出。
3. 開啓緩存
在網站部署環境安裝APC或者Xcache緩存可以有效提高網站運行性能和內存佔用
XCache 是一個開源的 opcode 緩存器/優化器, 這意味着他可以提升您服務器上 的 PHP 性能. 他經過把編譯 PHP 後的數據緩衝到共享內存從而避免重複的編譯 過程, 可以直接使用緩衝區已編譯的代碼從而提升速度. 一般可以提升您的頁面生 成速率 2 到5 倍, 下降服務器負載.
Alternative PHP Cache (APC)是一種對PHP有效的開放源高速緩衝儲存器工具,它可以緩存opcode的php中間碼。
4. 字段緩存
默認狀況下,字段緩存是自動生成的,在開發完成以後,基本上數據庫的變更變得 比較少,所以能夠考慮合併字段緩存到對應的模型類,這樣可以減小每次讀取字段 緩存的IO開銷。合併的方法是在Runtime/Data/_fields下面找到對應的字段緩存文件
4、 數據庫優化
一、選擇正確的存儲引擎
以 MySQL爲例,包括有兩個存儲引擎 MyISAM 和 InnoDB,每一個引擎都有利有弊。
MyISAM 適合於一些須要大量查詢的應用。InnoDB 的趨勢會是一個很是複雜的存儲引擎,對於一些小的應用,它會比 MyISAM 還慢。可是它支持「行鎖」 ,支持事務。
二、優化字段的數據類型
記住一個原則,越小的列會越快。對於大多數的數據庫引擎來講,硬盤操做多是最重大的瓶頸。因此,把你的數據變得緊湊會對這種狀況很是有幫助,由於這減小了對硬盤的訪問。
若是一個表只會有幾列罷了(好比說字典表,配置表),那麼,咱們就沒有理由使用 INT 來作主鍵,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 會更經濟一些。若是你不須要記錄時間,使用 DATE 要比 DATETIME 好得多。固然,你也須要留夠足夠的擴展空間。
三、爲搜索字段添加索引
索引並不必定就是給主鍵或是惟一的字段。若是在你的表中,有某個字段你總要會常常用來作搜索,那麼最好是爲其創建索引,除非你要搜索的字段是大的文本字段,那應該創建全文索引。
四、避免使用Select *從數據庫裏讀出越多的數據,
那麼查詢就會變得越慢。而且,若是你的數據庫服務器和WEB服務器是兩臺獨立的服務器的話,這還會增長網絡傳輸的負載。即便你要查詢數據表的全部字段,也儘可能不要用*通配符,善用內置提供的字段排除定義也許能給帶來更多的便利。
五、使用 ENUM 而不是 VARCHAR
ENUM 類型是很是快和緊湊的。在實際上,其保存的是 TINYINT,但其外表上顯示爲字符串。這樣一來,用這個字段來作一些選項列表變得至關的完美。例如,性別、民族、部門和狀態之類的這些字段的取值是有限並且固定的,那麼,你應該使用 ENUM 而不是 VARCHAR。
六、儘量的使用 NOT NULL
除非你有一個很特別的緣由去使用 NULL 值,你應該老是讓你的字段保持 NOT NULL。 NULL其實須要額外的空間,而且,在你進行比較的時候,你的程序會更復雜。 固然,這裏並非說你就不能使用NULL了,現實狀況是很複雜的,依然會有些狀況下,你須要使用NULL值。
七、固定長度的表會更快
若是表中的全部字段都是「固定長度」的,整個表會被認爲是 「static」 或 「fixed-length」。 例如,表中沒有以下類型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一個這些字段,那麼這個表就不是「固定長度靜態表」了,這樣,MySQL 引擎會用另外一種方法來處理。
固定長度的表會提升性能,由於MySQL搜尋得會更快一些,由於這些固定的長度是很容易計算下一個數據的偏移量的,因此讀取的天然也會很快。而若是字段不是定長的,那麼,每一次要找下一條的話,須要程序找到主鍵。
而且,固定長度的表也更容易被緩存和重建。不過,惟一的反作用是,固定長度的字段會浪費一些空間,由於定長的字段不管你用不用,他都是要分配那麼多的空間。
使用「垂直分割」技術,你能夠分割你的表成爲兩個一個是定長的,一個則是不定長的。
八、垂直分割
「垂直分割」是一種把數據庫中的表按列變成幾張表的方法,這樣能夠下降表的複雜度和字段的數目,從而達到優化的目的。
例如:在User表中有一個字段是家庭地址,這個字段是可選字段,相比起,並且你在數據庫操做的時候除了我的信息外,你並不須要常常讀取或是改寫這個字段。那麼,爲何不把他放到另一張表中呢? 這樣會讓你的表有更好的性能,你們想一想是否是,大量的時候,我對於用戶表來講,只有用戶ID,用戶名,口令,用戶角色等會被常用。小一點的表老是會有好的性能。
另外,你須要注意的是,這些被分出去的字段所造成的表,你不會常常性地去Join他們,否則的話,這樣的性能會比不分割時還要差,並且,會是極數級的降低。
九、EXPLAIN 你的 SELECT 查詢;
使用 EXPLAIN 關鍵字可讓你知道MySQL是如何處理你的SQL語句的。這能夠幫你分析你的查詢語句或是表結構的性能瓶頸。EXPLAIN 的查詢結果還會告訴你你的索引主鍵被如何利用的,你的數據表是如何被搜索和排序的……等等,等等。
一般咱們能夠對比較複雜的尤爲是涉及到多表的SELECT語句,把關鍵字EXPLAIN加到前面。你可使用phpmyadmin來作這個事。詳情見附件explain.doc.
5、前端優化
優化完後端和數據庫以後,咱們緊接着要作的就是針對輸出的頁面優化你的前端頁面和資源文件,主要包括對圖片、JS和樣式文件的優化。
咱們建議採用下列網頁性能測試工具進行檢測和分析,會給出相關的優化建議:
PageSpeed 谷歌開發的工具
網站管理員和網絡開發人員可使用PageSpeed來評估他們網頁的性能,並得到有關如何改進性能的建議。
yslow YSlow
能夠對網站的頁面進行分析,並告訴你爲了提升網站性能,如何基於某些規則而進行優化。
本文轉載於:php中文網