PHP5中,對於memory_limit的設定已經從以往的8M擴大到128M的上限。
對於配置中的定義解釋是:
memory_limit = 128M ; Maximum amount of memory a script may consume (128MB)
最大單線程的獨立內存使用量。也就是一個web請求,給予線程最大的內存使用量的定義。
現有的大部分網站或者論壇應用中,應用軟件的配備一般都是以如下的形式搭建:
Nginx(Apache) PHP Memcache Mysql
對於以上的應用軟件的采用,優點我就不再多說。但對於Memcache的使用就是為了減少對於數據庫的訪問的頻率的降低,也是提高服務響應的一種辦法。但是對於memcache和數據庫的數據存儲有區別的是,memcache的數據並不是以上數據的形式存儲在內存中,而是抽象化了之後以字符的形式,hash 表的形式存儲在內存之中。這樣的存儲區別導致,每次memcache的數據抽取必須全部數據反序擬化一次,將所有的數據導入進獨立的單一線程中,然後第二部才是進行過濾和抽取你所需要的數據。
在應用過程中,如果是讀取數據庫的數據,大家應該知道,優化的辦法應該是在SQL語句中比保證第一次過濾盡量是提高准確性,只取需要的字段,不要全部所有字段取出之後再在應用中過濾得到自己想要的字段,這樣對於服務器的負載會有本質的區別。
如果采用memcache,必然做不到數據庫在在第一次就精確過濾這點目標。那麼就需要在開始設計表的同時就需要考慮到這點,盡量保證被memcache數據表盡量保證數據的較少,可以多分表來完成。
memory_limit的內存分配,標配是128M。
一旦獨立的線程超過了128M,那PHP會報錯:
Fatal error: Allowed memory size of 33554432 bytes
對於8G內存的服務器,如果同時並發的響應達到50,每個都是128M的峰值,那估計也是服務器會卡死的時候。
盡量降低128M的內存配置,如果調整至64M,服務器的負載基本能下降一半左右,如果能調整至32M效果更好。
但是對於應用的要求就更高,很多表建立初期就沒有考慮到這個問題,如果你要采用memcache作為數據的存儲,必須提前完成優化數據表的設計部署,降低獨立線程PHP的內存使用量,服務器的響應和負載降低的就不僅僅是幾個百分點的效果了。