PHP 性能優(yōu)化

PHP雖然是世界上最好的語言,但是它本身作為一門腳本語言败玉,其運(yùn)行效率一直被人們所詬病茄蚯。

作為以PHP為開發(fā)語言的應(yīng)用程序而言,PHP程序的性能能影響到整個(gè)架構(gòu)性能的百分之30左右闻妓,不會超過百分之50菌羽,其余的是硬件的、操作系統(tǒng)的由缆、存儲的等等其他性能優(yōu)化注祖;因此,PHP程序的性能好壞均唉,對于整個(gè)系統(tǒng)架構(gòu)而言是晨,還是很重要的。

PHP的性能優(yōu)化分為一下三個(gè)層次:

PHP.png

這三個(gè)層次性能優(yōu)化的難度依次上升舔箭,效果卻依次降低罩缴。在此蚊逢,我們重點(diǎn)討論前兩種層次。

1. PHP代碼的優(yōu)化

多使用PHP內(nèi)置的函數(shù)箫章,少使用PHP代碼烙荷,且精簡PHP代碼

PHP的執(zhí)行流程為:


php_flow.png

這個(gè)原理是很簡單的,PHP是解釋型語言檬寂,PHP代碼得經(jīng)過好幾步轉(zhuǎn)化才能變成最終的機(jī)器碼终抽,假如PHP代碼寫的很多,不夠精簡桶至,轉(zhuǎn)化的步驟就會變長昼伴,自然會影響PHP程序的性能。而PHP內(nèi)置的函數(shù)是由C語言編寫的塞茅,運(yùn)行速度自然快亩码。

PHP內(nèi)置函數(shù)的執(zhí)行效率也有優(yōu)先級季率,可以盡量使用快的

這個(gè)原因也是顯而易見的野瘦,雖然都是C語言寫的程序,但是C實(shí)現(xiàn)的方式還是不同的飒泻,有的實(shí)現(xiàn)方式快一些鞭光,有的實(shí)現(xiàn)的慢一些,所以調(diào)用快的效率肯定會高一點(diǎn)泞遗。
例如:

  • array_key_exists效率要比in_array
  • requirerequire_once效率高
  • 單引號''比雙引號""效率高
減少PHP魔法函數(shù)的使用

PHP的魔法函數(shù)用起來很爽惰许,但是既然用的這么爽,那么PHP在底層肯定幫你做了諸多事情史辙,做的這么一堆事情汹买,不能不消耗性能吧。
PHP魔法函數(shù)為了讓程序員爽聊倔,在語言級別幫程序猿做了很多晦毙,會帶啦性能開銷,我們應(yīng)該看情況酌情使用耙蔑。

不要使用錯(cuò)誤抑制符@

@錯(cuò)誤抑制符這玩意兒的實(shí)現(xiàn)原理和魔法函數(shù)差不多见妒,都是方便了程序猿苦了自己;原理也很簡單甸陌,就是在添加了錯(cuò)誤@符號的前面和后面添加了Opcode须揣,Opcode的作用就是和error_reporting忽略錯(cuò)誤一樣一樣的,然后在添加了@符號的代碼之后再添加上一些Opcode钱豁,將錯(cuò)誤等級恢復(fù)耻卡。

可以用PHP的Opcode查看擴(kuò)展vld來查看添加了@符號的代碼情況。(vld的使用也很簡單牲尺,就倆指令vld.active=1vld.execute=0., vld.active=1表示想要用擴(kuò)展卵酪,vld.execute=0.表示只是查看Opcode代碼,vld.execute=1.表示要執(zhí)行php程序。``php -vld.active=1 -vld.execute=0 xxx.php)

合理使用PHP內(nèi)存凛澎,釋放掉沒用的變量

要盡量合理的使用內(nèi)存霹肝,例如:

  • 從數(shù)據(jù)庫中取字段,只取某個(gè)字段塑煎,就不要取出全部字段沫换。 select xxx 和 select * 的區(qū)別
  • 讀取文件,文件使用完后最铁,文件close的問題
  • 使用unset及時(shí)釋放掉無用的變量讯赏。(但是也會有unset不掉的情況)
盡量減少使用正則表達(dá)式

正則表達(dá)式需要回溯,當(dāng)正則表達(dá)式越長冷尉,它回溯的開銷就會越大漱挎,優(yōu)化表達(dá)式也是個(gè)技術(shù)活兒,所以建議盡量使用PHP內(nèi)置的處理函數(shù)來替代雀哨。

避免循環(huán)內(nèi)做重復(fù)的計(jì)算

例如:

$str = "hello world";
for ($i = 0; $i<strlen($str); $i ++)
{
    //do something
}

strlen($str)是不是被重復(fù)計(jì)算了磕谅?有意義嗎?寫在外邊不好嗎雾棺?

避免數(shù)據(jù)密集型計(jì)算

PHP是由C語言來實(shí)現(xiàn)的膊夹,PHP本身在處理一些計(jì)算的時(shí)候,額外的開銷是很大的捌浩,例如它的變量寄存放刨、語言處理,都需要C來實(shí)現(xiàn)…PHP的“慢”尸饺,不是由于一些特性而“慢”进统,是整體就慢。所以在處理一些大批量數(shù)據(jù)例如大批量日志處理浪听,大批量數(shù)據(jù)分析的時(shí)候螟碎,是十分不適合的,和C等語言比起來不是一個(gè)數(shù)量級馋辈。

PHP的語言特性決定了PHP不適合做大數(shù)據(jù)量的計(jì)算抚芦。
PHP適合做的事:

php_duty2222.png

PHP適合做一個(gè)紐帶,適合做一些字符串迈螟、文本處理叉抡。

使用Opcode cache

Opcode是整個(gè)PHP中最接近機(jī)器碼的地方,假如我們對Opcode做一下緩存答毫,就節(jié)約了PHP代碼解析褥民、編譯的開銷,在此洗搂,我們可以使用一些擴(kuò)展來對Opcode進(jìn)行緩存

  • APC消返。(已經(jīng)不更新)
  • 鳥哥的yac载弄。

2. PHP周邊性能優(yōu)化

php_around3333.png

以上就是PHP周邊的環(huán)境。只有PHP周邊的環(huán)境也得到了很好的性能優(yōu)化撵颊,才能將PHP的系統(tǒng)架構(gòu)發(fā)揮到極致宇攻。

不要使用過多的IO

PHP場景的性能開銷次序?yàn)椋?code>讀取內(nèi)存 < 讀取數(shù)據(jù)庫 < 讀取文件 < 讀取網(wǎng)絡(luò)數(shù)據(jù)

PHP是不適合編寫IO密集型的程序。

優(yōu)化網(wǎng)絡(luò)請求
設(shè)置超時(shí)時(shí)間
  • 連接超時(shí) 200ms
  • 讀超時(shí) 800ms
  • 寫超時(shí) 500ms
將串行請求并行化
  • 使用curl_multi_*()的函數(shù)代替curl
  • 使用swoole擴(kuò)展(比 curl_multi還要好)
合理的將PHP接口輸出壓縮

使用gzip可以將PHP接口輸出壓縮倡勇,提高我們的IO逞刷,但是壓縮的過程需要額外的計(jì)算消耗,需要消耗部分CPU性能妻熊,需要合理使用夸浅;當(dāng)數(shù)據(jù)量小于幾十kb的時(shí)候,用gzip還不如不用扔役,當(dāng)gzip數(shù)據(jù)大于100k的時(shí)候帆喇,壓縮是合理的,而且壓縮的程度還和數(shù)據(jù)重復(fù)的個(gè)數(shù)有關(guān)亿胸,如果重復(fù)的多坯钦,gizp就壓縮的小,如果重復(fù)的少损敷,gzip壓縮的就稍微大點(diǎn)兒葫笼。

3. 最后的解決方案

使用性能優(yōu)化分析工具
  • Facebook的XHPorf
  • 壓力測試工具Apache的ab
  • opcode代碼分析工具vld
用PHP擴(kuò)展代替部分邏輯

這個(gè)不用多說深啤,很多大公司都是這么做的拗馒。
把很多PHP的library做成.so文件。

使用PHP7

HHVM是由Facebook推出的,用來提升PHPruntime效率的溯街,效果十分明顯诱桂。但是,就PHP7而言呈昔,官方覺得PHP7的engine更勝一籌挥等,所以,如果想要整體提高性能堤尾,升級PHP7還是必要的肝劲。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市郭宝,隨后出現(xiàn)的幾起案子辞槐,更是在濱河造成了極大的恐慌,老刑警劉巖粘室,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榄檬,死亡現(xiàn)場離奇詭異,居然都是意外死亡衔统,警方通過查閱死者的電腦和手機(jī)鹿榜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門海雪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舱殿,你說我怎么就攤上這事奥裸。” “怎么了沪袭?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵刺彩,是天一觀的道長。 經(jīng)常有香客問我枝恋,道長创倔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任焚碌,我火速辦了婚禮畦攘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘十电。我一直安慰自己知押,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布鹃骂。 她就那樣靜靜地躺著台盯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畏线。 梳的紋絲不亂的頭發(fā)上静盅,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機(jī)與錄音寝殴,去河邊找鬼蒿叠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蚣常,可吹牛的內(nèi)容都是我干的市咽。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼抵蚊,長吁一口氣:“原來是場噩夢啊……” “哼施绎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贞绳,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤谷醉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后熔酷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孤紧,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年拒秘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了号显。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臭猜。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖押蚤,靈堂內(nèi)的尸體忽然破棺而出蔑歌,到底是詐尸還是另有隱情,我是刑警寧澤揽碘,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布次屠,位于F島的核電站,受9級特大地震影響雳刺,放射性物質(zhì)發(fā)生泄漏劫灶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一掖桦、第九天 我趴在偏房一處隱蔽的房頂上張望本昏。 院中可真熱鬧,春花似錦枪汪、人聲如沸涌穆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宿稀。三九已至,卻和暖如春赖捌,著一層夾襖步出監(jiān)牢的瞬間祝沸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工巡蘸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奋隶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓悦荒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嘹吨。 傳聞我的和親對象是個(gè)殘疾皇子搬味,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

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

  • 1、用單引號代替雙引號來包含字符串蟀拷,這樣做會更快一些碰纬。因?yàn)镻HP會在雙引號包圍的字符串中搜尋變量,單引號則不會问芬,注...
    紅魚綠魚與驢閱讀 1,072評論 0 3
  • 總體介紹: 一悦析、規(guī)范說明 性能是網(wǎng)站運(yùn)行是否良好的關(guān)鍵因素, 網(wǎng)站的性能與效率影響著公司的運(yùn)營成本及長遠(yuǎn)發(fā)展此衅,編寫...
    henryspace閱讀 874評論 0 0
  • 1强戴、如果能將類的方法定義成static亭螟,就盡量定義成static,它的速度會提升將近4倍骑歹。 2预烙、$row['id'...
    紅魚綠魚與驢閱讀 183評論 0 0
  • 隨著孩子年齡的長大,與父母之間的隔閡也變得越大道媚。 關(guān)于孩子的隱私問題扁掸,我不知道家長怎么想的。每個(gè)人都需要自己的空...
    f7c64a05e8a9閱讀 377評論 1 2
  • 付出了一定要得到回報(bào),付出才有價(jià)值镀脂! 如果你去超市買東西狸剃,付了錢東西就不要了嗎?但是放在其他地方狗热,則是過程很重要钞馁,...
    拂曉飛閱讀 293評論 1 0