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