WEB程序獲取信息的方式主要是查詢數據庫,當數據庫不是很大的情況下不會有太大的問題。然而,隨著網站的發展,數據庫呈幾何級數的方式增長的時候,就會出現瓶頸,於是PHP緩存技術誕生了。PHP緩存技術工作時,當程序查詢數據的時候,會把相應的結果序列化後保存到文件中,以後同樣的查詢語句就可以不用直接查詢數據庫,而是從緩存文件中獲得。這一改進使得程序運行速度得以太幅度提升。
php緩存技術的應用時相當普遍的,也許有些人還對這項技術不太了解,我們現在就為大家詳細的介紹一下PHP緩存技術的相關應用技巧。
在大部份情況下我們的網站都會使用數據庫作為站點數據存儲的容器。當你執行一個SQL查詢時,典型的處理過程是:連接數據庫->准備SQL查詢->發送查詢到數據庫->取得數據庫返回結果->關閉數據庫連接。但數據庫中有些數據是完全靜態的或不太經常變動的,緩存系統會通過 把SQL查詢的結果緩存到一個更快的存儲系統中存儲,從而避免頻繁操作數據庫而很大程度上提高了程序執行時間,而且緩存查詢結果也允許你後期處理。
這裡所說的數據緩存是指數據庫查詢PHP緩存機制,每次訪問頁面的時候,都會先檢測相應的緩存數據是否存在,如果不存在,就連接數據庫,得到數據,並把查詢結果序列化後保存到文件中,以後同樣的查詢結果就直接從緩存表或文件中獲得。用的最廣的例子看Discuz的搜索功能,把結果ID緩存到一個表中,下次搜索相同關鍵字時先搜索緩存表。
舉個常用的方法,多表關聯的時候,把附表中的內容生成數組保存到主表的一個字段中,需要的時候數組分解一下,這樣的好處是只讀一個表,壞處就是兩個數據同步會多不少步驟,數據庫永遠是瓶頸,用硬盤換速度,是這個的關鍵點。
每次訪問頁面的時候,都會先檢測相應的緩存頁面文件是否存在,如果不存在,就連接數據庫,得到數據,顯示頁面並同時生成緩存頁面文件,這樣下次訪問的時候頁面文件就發揮作用了。(模板引擎和網上常見的一些緩存類通常有此功能)
在裡就不介紹了,不是本文所要討論的,只簡單提一下:
Memcached是高性能的,分布式的內存對象緩存系統,用於在動態應用中減少數據庫負載,提升訪問速度。dbcached 是一款基於 Memcached 和 NMDB 的分布式 key-value 數據庫內存緩存系統。以上的緩存技術雖然能很好的解決頻繁查詢數據庫的問題,但其缺點在在於數據無時效性。
檢查文件是否存在並且時間戳小於設置的過期時間,如果文件修改的時間戳比當前時間戳減去過期時間戳大,那麼就用緩存,否則更新緩存。設定時間內不去判斷數據是否要更新,過了設定時間再更新緩存。以上只適合對時效性要求不高的情況下使用。
當插入數據或更新數據時,強制更新緩存。在這裡我們可以看到,當有大量數據頻繁需要更新時,最後都要涉及磁盤讀寫操作。怎麼解決呢?我在日常項目中,通常並不緩存所有內容,而是緩存一部分 不經常變的內容來解決。但在大負荷的情況下,最好要用共享內存做緩存系統。
到這裡PHP緩存也許有點解決方案了,但其缺點是,因為每次請求仍然要經過PHP解析,在大負荷的情況下效率問題還是比效嚴重,在這種情況下,也許會用到靜態緩存。
這裡所說的靜態緩存是指HTML緩存,HTML緩存一般是無需判斷數據是否要更新的,因為通常在使用HTML的場合一般是不經常變動內容的頁面。數據更新的時候把HTML也強制更新一下就可以了。
除了上述緩存手段外,還有一些服務器端的緩存方案,非代碼級的: