PHP緩存技術

緩存捡絮,顧名思義臼闻,就是臨時存儲信息以提高訪問性能琅束。PHP的緩存技術大體可分為三大類:

1. 緩存內(nèi)容(Caching content)

2. 內(nèi)存緩存(Memory Cache)

3. 數(shù)據(jù)庫緩存(Database Cache)

1. 緩存內(nèi)容

將某個腳本的最終輸出作為靜態(tài)文件存放在文件系統(tǒng)中搏屑,比如??信息,商品顯示頁损俭,當數(shù)據(jù)庫內(nèi)容被修改或文件過期時,重新執(zhí)行原始腳本以更新緩存內(nèi)容潘酗。簡單示例如下:

內(nèi)容緩存是最為常見的杆兵,比如輸出緩存ob_start,頁面部分緩存ob_get_contents仔夺,甚至數(shù)據(jù)庫某些查詢結(jié)果的緩存琐脏。

2. 內(nèi)存緩存

顧名思義,通過內(nèi)存進行緩存囚灼,顯然會比緩存在文件系統(tǒng)中快出許多骆膝,常見的技術如下:

Opcode Cache

簡要介紹下PHP的運行機制:a)子進程解釋器解析php腳本,比如Zend Complier; b)zend_language_scanner會首先對代碼進行掃描灶体,將PHP代碼進行詞法分析阅签,轉(zhuǎn)化為一系列的token array;c)zend_language_parse將上一步產(chǎn)生的一系列token處理空格等無用的代碼后轉(zhuǎn)化成一系列表達式蝎抽;d)這些表達式經(jīng)過complier階段生成opcode【即Operation code政钟,是一個四元組(opcode,op1,op2,result)】并返回zend_op_array指針;e)zend_vm_execute根據(jù)傳入的zend_op_array指針樟结,執(zhí)行opcode并將結(jié)果返回輸出养交;

對opcode進行緩存的軟件很多,比如apc瓢宦,eAcclerator碎连,Xcache,Zend Platform驮履,這里主要介紹下apc;

APC提供了兩種緩存功能:緩存Opcode(目標文件)鱼辙,即apc_complier_cache,緩存用戶數(shù)據(jù)即apc_user_cache. 下圖為使用了apc_complier_cache后的php解析過程:

由于apc并未內(nèi)置到PHP解釋器內(nèi)核中玫镐,你需要單獨安裝并在php.ini中添加apc配置:

apc的使用是比較簡單的倒戏,主要比較常用的有三個方法:

apc_add/apc_store–?store a variable in the cache. The only difference betweenapc_addandapc_storeis thatapc_storeoverwrites the data if it already exists andapc_adddoes not。

apc_fetch– fetch a variable from the cache

apc_delete– delete a variable from the cache.

http://www.360doc.com/content/16/0204/17/22355405_532718314.shtml

據(jù)說apc使用了spinlocks(自旋)鎖機制恐似,能夠達到最佳性能杜跷,但這也可能會死鎖,進而影響到php-fpm進程(https://yq.aliyun.com/articles/1699);

一方面apc_store對于系統(tǒng)設置等PHP變量的緩存是比較好的選擇葛闷,但apc不合適通過apc_store頻繁變更用戶數(shù)據(jù)憋槐,會出現(xiàn)一些奇異現(xiàn)象;

Memcache

分布式對象緩存系統(tǒng)孵运,通過在內(nèi)存中以鍵值對的形式緩存數(shù)據(jù)和對象以減少讀取數(shù)據(jù)庫的次數(shù)秦陋,進而提高驅(qū)動網(wǎng)站的速度飞袋。它可以應對任意多個連接妇垢,使用非阻塞的網(wǎng)絡IO。

Memcache與memcached區(qū)別:Memcache是項目名稱旅薄,而memcached是項目在服務器段的主程序文件名旷赖;

所謂的分布式對象緩存體現(xiàn)顺又,單個服務器就算了,比如現(xiàn)memcache客戶端要添加“shanghai”等孵,客戶端根據(jù)查詢算法(比如Consistent hashing根據(jù)“鍵”來決定保存數(shù)據(jù)的memcached服務器稚照。至于memcache服務器端,它會在內(nèi)存中開辟一塊空間,然后建立一個HashTable, 并復制管理維護俯萌」迹“shanghai”到了選定的服務器后,將“shanghai”維護到HashTable咐熙,并在內(nèi)存中保存其值弱恒。

同樣在獲取保存的數(shù)據(jù)時,比如鍵值“hangzhou”棋恼,memcache客戶端會通過相同的方式返弹,根據(jù)鍵值選擇服務器,然后發(fā)送get命令取得value爪飘,當然若不幸該鍵值尚不存在或已失效义起,那就從元數(shù)據(jù)取之并reset。這樣鍵值對通過HashTable存儲到不同的服務器上师崎,就實現(xiàn)了memcached的分布式默终。

注意:查詢算法因節(jié)點分布不均而造成的數(shù)據(jù)傾斜問題,memcache服務器增多是否會影響鍵值的重新分布以及增減服務器是否會導致緩存的大范圍丟失犁罩。

Memcache區(qū)分為memcache服務器端的安裝和memcache客戶端安裝齐蔽,默認端口號11211。簡單示例如下:

既然是緩存昼汗,定是有過期時間的肴熏,比如上述圖片中set('things',$things,false,86400)鬼雀,對memcache而言顷窒,它不會在過期監(jiān)視上耗費CPU時間,當某個值過期后,其內(nèi)存并沒有被刪除鞋吉,而是當再次在get時查看記錄的時間戳鸦做,檢查記錄是否過期,如果已過期谓着,則返回空并且清空泼诱,這種技術被稱為lazy(惰性)expiration。

另外赊锚,memcache會優(yōu)先使用已超時記錄的空間治筒,但即使如此,也會發(fā)生追加新紀錄時空間不足的情況舷蒲,此時就要使用Least Recently Used(LRU)機制來分配空間【即使某個key設置的是永久有效期】耸袜。

對于分布式的對象緩存系統(tǒng)memcache,其須以root權限運行牲平,且訪問是無用戶狀態(tài)的堤框,考慮到安全性,一般通過放在內(nèi)網(wǎng)纵柿,并通過防火墻限制外網(wǎng)訪問memcache端口達到安全蜈抓。

數(shù)據(jù)庫緩存

上述的緩存技術都是在應用層討論的,database server本身也可以cache昂儒,典型的就是SQL第一次查詢時解析沟使,后續(xù)查詢則直接從database server cache中獲取結(jié)果。簡單config MySQL my.cnf如下:

query_cache_type =1

query_cache_limit = 1M

query_cache_size =16M

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荆忍,一起剝皮案震驚了整個濱河市格带,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌刹枉,老刑警劉巖叽唱,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異微宝,居然都是意外死亡棺亭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門蟋软,熙熙樓的掌柜王于貴愁眉苦臉地迎上來镶摘,“玉大人,你說我怎么就攤上這事岳守∑喔遥” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵湿痢,是天一觀的道長涝缝。 經(jīng)常有香客問我扑庞,道長,這世上最難降的妖魔是什么拒逮? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任罐氨,我火速辦了婚禮,結(jié)果婚禮上滩援,老公的妹妹穿的比我還像新娘栅隐。我一直安慰自己,他們只是感情好玩徊,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布租悄。 她就那樣靜靜地躺著,像睡著了一般恩袱。 火紅的嫁衣襯著肌膚如雪恰矩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天憎蛤,我揣著相機與錄音外傅,去河邊找鬼。 笑死俩檬,一個胖子當著我的面吹牛萎胰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播棚辽,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼技竟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屈藐?” 一聲冷哼從身側(cè)響起榔组,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎联逻,沒想到半個月后搓扯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡包归,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年锨推,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片公壤。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡换可,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出厦幅,到底是詐尸還是另有隱情沾鳄,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布确憨,位于F島的核電站译荞,受9級特大地震影響套媚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜磁椒,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望玫芦。 院中可真熱鬧浆熔,春花似錦、人聲如沸桥帆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽老虫。三九已至叶骨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間祈匙,已是汗流浹背忽刽。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留夺欲,地道東北人跪帝。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像些阅,于是被迫代替她去往敵國和親伞剑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

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

  • php緩存技術 普遍緩存技術 數(shù)據(jù)緩存:這里所說的數(shù)據(jù)緩存是指數(shù)據(jù)庫查詢緩存市埋,每次訪問頁面的時候,都會先檢測相應的...
    桖辶殤閱讀 2,219評論 0 4
  • 1黎泣、普遍緩存技術:數(shù)據(jù)緩存:這里所說的數(shù)據(jù)緩存是指數(shù)據(jù)庫查詢PHP緩存機制,每次訪問頁面的時候,都會先檢測相應的緩...
    bycall閱讀 931評論 0 5
  • php內(nèi)存緩存實現(xiàn)程序代碼 1缤谎、普遍緩存技術:數(shù)據(jù)緩存:這里所說的數(shù)據(jù)緩存是指數(shù)據(jù)庫查詢PHP緩存機制抒倚,每次訪問頁...
    桖辶殤閱讀 1,340評論 2 2
  • 一、MemCache簡介 session MemCache是一個自由坷澡、源碼開放衡便、高性能、分布式的分布式內(nèi)存對象緩存...
    李偉銘MIng閱讀 3,810評論 2 13
  • 因為不夠喜歡 還是因為你不是他的驕傲 擦
    悠揚0501閱讀 425評論 0 0