PHP服務端優化全面總結

一.優化PHP原則

1.1PHP代碼的優化

(1)升級最新的PHP版本

鳥哥PPT裏的對比數據,就是WordPress在PHP5.6執行100次會產生70億次的CPU指令執行數目,而在PHP7中只須要25億次,減小64.2%。
參考:PHP的性能演進(從PHP5.0到PHP7.1的性能全評測)php

(2)減小include和require的使用

include和require方法中包含了文件讀取邏輯,大量使用會形成性能的降低.
解決這個問題可使用APC加速器組件,緩解此類問題.html

(3)使用局部變量代替全局變量

局部變量的速度比全局變量運行的速度要快,使用局部變量能夠提升運行效率,同時也易於管理.mysql

(4)使用靜態函數和方法

結合實際狀況,儘可能添加static標籤,使用靜態函數或者方法,能夠有效的提高執行速度.正則表達式

(5)及時釋放無用的變量和資源

PHP自帶內存回收機制,可是咱們不能過度的依賴,咱們要經過unsettle方法,或者直接設置爲null的方式來及時的釋放無用的變量和資源.redis

(6)使用單引號代替雙引號

單引號和雙引號均可以用來包含字符串,可是雙引號有字符轉義和變量解析的邏輯,因此儘可能使用單引號,提高執行效率.算法

(7)減小@屏蔽錯誤的使用

@號能夠用來屏蔽報錯的信息,可是須要注意的是@會下降腳本的運行速度.sql

(8)減小PHP中OOP的使用

使用OOP來構建程序框架比較便捷,可是可能會產生額外的系統開銷.因此咱們要根據實際狀況合理的使用OOP思想.數據庫

(9)使用抽象類代替接口

PHP中使用接口(interface)的成本比較高,咱們應該儘可能避免使用,可使用抽象類(abstract class)來代替.數組

(10)減小正則表達式的使用

正則表達式的執行成本十分的高昂,儘可能使用PHP中自帶的字符串處理函數來代替.緩存

(11)壓縮須要存儲的數據

例如咱們保存IP地址的時候可使用ip2long函數把IP地址轉化成整數型數據存儲,使用的時候經過long2ip函數還原.
對大數據還可使用gzcompress和gzuncompress進行壓縮和解壓.

(12)使用高效的PHP語句

分支語句效率:switch ... case>if ... elseif ... else.
循環語句效率:foreach>for>while.
疊加語句效率:++$i>$i++.

(13)使用高效的PHP函數

字符打印函數效率:echo>print
字符替換函數效率:strtr>str_replace>preg_replace
數組查詢函數效率:array_key_exists>isset>in_array

1.2Session機制的優化

(1)在PHP session設置中避免開啓auto_start,一般在使用的時候在使用session_start函數開啓,減小資源消耗.

(2)合理設置session的有效期,有效期設置過長致使出現負載問題,一般設置在1到8小時之間.

(3)PHP session默認使用文件存儲,咱們能夠經過php.ini中的session_handle選項選擇須要的存儲方式,常見的有數據庫和高速緩存服務Memcache Redis等.

1.3使用緩存中間件

(1)Memcache

(2)Redis

1.4使用APC加速

二.數據庫優化

2.1SQL優化

(1)使用慢查詢.

在MySQL數據庫配置文件my.cnf中加入配置,使用show status like 'Slow%'查看慢查詢數量.
分析查詢時間大於設置時間的SQL語句,使用explain語句.

(2)使用索引

where:使用肯定性的判斷添加字段通常加索引
like: 'faf%'使用索引,'%faf%'不能使用索引
少用不肯定的判斷.如:!=,is not null, not in等.索引很是佔據空間,合理建立索引.

(3)使用表關聯須要慎重

經常使用的內鏈接(inner join)和左鏈接(left join)每次進行關聯查詢的時候都會對兩張數據表的笛卡爾乘積進行查詢,掃描數量大,因此咱們儘可能使用添加冗餘字段避免表關聯,使用空間換時間.

若是難以免使用表關聯,那麼咱們最好給關聯的字段創建索引.

不要使用SQL的子查詢,效率很是的低.

(4)使用MySQL中查詢條件和函數要謹慎

不要使用查詢數量的COUNT(*),而是使用COUNT(1).
儘可能不要使用DISTINCT.
group by計算十分消耗資源.
max(),min(),substr(),concat(),date_format(),to_days()等都會加大數據庫負擔.
咱們應儘可能讓數據庫負責查詢工做,其餘使用PHP來作.

2.3數據庫架構設計

(1)主從結構

主庫負責數據寫入,從庫負責數據查詢,主庫寫入後快速同步從庫.
主從架構既能避免讀寫形成的鎖表問題,又能多臺從庫分擔訪問.
但應該注意同步不及時問題.例如,用戶修改信息時,主庫更新.而從從庫獲取數據時,從庫卻沒有從主庫同步過來.就會形成信息無變化現象.

(2)集羣(Cluster)

當主從結構沒法知足需求時,咱們可使用集羣結構.由衆多的主從結構數據庫組成集羣.

集羣架構對分佈式邏輯要求比較高,一般是使用惟一的字段做爲分佈式數據的ID,經過散列分佈算法得到數據所在位置,常見的算法有取模算法,一致性散列算法等.

還能夠按照數據庫名來實現分佈式存儲數據.這種算法比較簡單實用,因爲數據庫的相關功能不一樣,每一個數據庫訪問量和數據量也不平均,因此能夠按照數據庫名來處理.

相關文章
相關標籤/搜索