擴(kuò)展PHP的五個(gè)簡(jiǎn)單技巧,讓單服務(wù)器并行支撐30000用戶(hù)
Jonathan Block于RockThePost.com(集資公司)擔(dān)任CTO一職,基于業(yè)務(wù)需求,公司需要他們同時(shí)給100萬(wàn)個(gè)投資人發(fā)送電子郵件。對(duì)于只有兩個(gè)人的工程團(tuán)隊(duì),確定服務(wù)器可以同時(shí)發(fā)送郵件的數(shù)目就成為了當(dāng)務(wù)之急。
RockThePost.com建立于Ec2的LAMP堆棧之上,非常典型的小規(guī)模構(gòu)造:
- PHP的Zend Framework 2
- 使用了2個(gè)m1.medium
- 使用ELB分配負(fù)載
- 主/從MySQL數(shù)據(jù)庫(kù)
- 使用Siege進(jìn)行負(fù)載測(cè)試
在業(yè)務(wù)實(shí)現(xiàn)過(guò)程中,Block對(duì)其中的秘訣做出了總結(jié),讓網(wǎng)絡(luò)服務(wù)器可以同時(shí)給3萬(wàn)用戶(hù)并行發(fā)送郵件:
1. 使用PHP的APC特性。APC——Alternative PHP Cache,雖然官方稱(chēng)為“可選PHP緩存”,但是稱(chēng)為“另一個(gè)PHP緩存也不為過(guò)”,因?yàn)樗梢郧袑?shí)的提升網(wǎng)站的性能。
2. 把所有不是.php的請(qǐng)求都分配給CDN(內(nèi)容分發(fā)網(wǎng)絡(luò)),不要使用你的服務(wù)器處理靜態(tài)文件。他們使用S3來(lái)存儲(chǔ)所有,并使用CloudFront作為他們的CDN。最近CloudFront出現(xiàn)的一些問(wèn)題迫使他們不得不直接使用S3服務(wù)。
3. 切勿將PHP代碼里的鏈接指向其它的服務(wù)器。比如數(shù)據(jù)庫(kù)以及memcache服務(wù)器,除非是強(qiáng)制性的或者是沒(méi)有其它方法實(shí)現(xiàn)你的目的。在執(zhí)行流中讓鏈接指向其它服務(wù)器是非常沒(méi)有效率的:可能會(huì)使服務(wù)器受到限制,從而降低處理的速度。使用APC鍵/值存儲(chǔ)來(lái)儲(chǔ)存數(shù)據(jù),并使用Barnish來(lái)緩存整個(gè)頁(yè)面。
4. 使用Varnish。一般情況下,站點(diǎn)上的所有網(wǎng)頁(yè)都不會(huì)改變或者是不會(huì)做大型的改動(dòng)。Varnish就對(duì)于網(wǎng)絡(luò)服務(wù)器緩存有著Memcache/ModRewrite的作用。同樣在壓力測(cè)試中,使用前后的性能差異很大。
5. 使用更大的服務(wù)器實(shí)例,比如c1.xlarge有8個(gè)核心可以應(yīng)對(duì)負(fù)載,而m1.medium只有一個(gè)核心可以處理請(qǐng)求。
可以使用Google Analytics來(lái)分析每個(gè)用戶(hù)在每個(gè)頁(yè)面上花費(fèi)的時(shí)間。收集這些信息,使用Siege來(lái)運(yùn)行壓力測(cè)試,從而不斷的熟悉自己業(yè)務(wù)的負(fù)載類(lèi)型,以便更好的提升程序的擴(kuò)展性。