擴展PHP的五個簡單技巧,讓單服務器并行支撐30000用戶
Jonathan Block于(yu)RockThePost.com(集資公(gong)司)擔任CTO一職,基(ji)于(yu)業務需求,公(gong)司需要他們同(tong)時給100萬個投(tou)資人發送電子郵(you)件。對(dui)于(yu)只有兩個人的(de)(de)工程團隊,確定服務器可以同(tong)時發送郵(you)件的(de)(de)數目就(jiu)成為(wei)了當務之急(ji)。
RockThePost.com建立于(yu)Ec2的(de)LAMP堆(dui)棧之上,非(fei)常典型的(de)小規模構造(zao):
PHP的Zend Framework 2
使(shi)用了(le)2個m1.medium
使用ELB分配負載(zai)
主(zhu)/從(cong)MySQL數據庫(ku)
使(shi)用Siege進行負載(zai)測試
在業務實現(xian)過程中,Block對其中的秘(mi)訣做出了總(zong)結,讓網絡服務器可以(yi)同時給3萬用戶(hu)并行發送郵件:
1.使用PHP的APC特性。APC——Alternative PHP Cache,雖然官方(fang)稱(cheng)為(wei)“可(ke)(ke)選PHP緩存”,但(dan)是稱(cheng)為(wei)“另一個(ge)PHP緩存也不為(wei)過”,因(yin)為(wei)它(ta)可(ke)(ke)以切實的提升網站的性(xing)能。
2.把所有不是.php的請求都分配給CDN(內容分發網絡),不要使用(yong)你的(de)服務器處理靜(jing)態文件(jian)。他們使用(yong)S3來存儲所有,并使用(yong)CloudFront作為他們的(de)CDN。最近CloudFront出(chu)現(xian)的(de)一些問題迫使他們不得(de)不直接(jie)使用(yong)S3服務。
3.切勿將PHP代碼里的鏈接指向其它的服務器。比如數(shu)據(ju)庫以及memcache服(fu)務(wu)器,除非是(shi)(shi)(shi)強(qiang)制性的(de)(de)(de)或(huo)者是(shi)(shi)(shi)沒(mei)有其(qi)它方法實現你的(de)(de)(de)目的(de)(de)(de)。在執(zhi)行(xing)流中讓鏈接(jie)指向其(qi)它服(fu)務(wu)器是(shi)(shi)(shi)非常沒(mei)有效(xiao)率的(de)(de)(de):可能會使服(fu)務(wu)器受到限制,從而(er)降低處理的(de)(de)(de)速度(du)。使用APC鍵/值存(cun)儲(chu)來(lai)儲(chu)存(cun)數(shu)據(ju),并使用Barnish來(lai)緩存(cun)整個(ge)頁面。
4.使用Varnish。一(yi)般情況下,站點上的(de)所有網(wang)頁都不會改變或者是不會做(zuo)大(da)型的(de)改動。Varnish就對于網(wang)絡服務器緩存有著Memcache/ModRewrite的(de)作用。同(tong)樣在壓力(li)測試中,使用前后的(de)性能差異很大(da)。
5.使用更大的服務器實例,比如c1.xlarge有(you)8個(ge)核(he)心(xin)可以應對(dui)負載,而m1.medium只有(you)一個(ge)核(he)心(xin)可以處(chu)理請求。
可以使用(yong)Google Analytics來分析每個(ge)用(yong)戶在每個(ge)頁面上花費(fei)的(de)時間。收集這些信息,使用(yong)Siege來運行壓力測試,從(cong)而不(bu)斷(duan)的(de)熟悉自己業務的(de)負(fu)載類型(xing),以便更(geng)好的(de)提升程序的(de)擴展性。