有些時候我們希望減少對資料庫的查詢來提高程式的效能,因為這些資料不是經常變更的,而是會在很長一段時間內都不會變化,因此,我們每串連一次資料庫,都會把相應的結果用檔案的形式儲存起來。比如對於一個商城來說,我們的商品的數量可能會經常變,但是我們的商品類型以及商品的價格這些東西都會在很長的一段時間內不會變更,如果我們需要頻繁的查詢它們的時候,就可以使用資料庫緩衝技術。
緩衝的原因
第一點首先看我們普通情況下執行一條SQL查詢的開銷,我們先串連資料庫,然後準備SQL查詢,接下來發送查詢資訊,然後取得返回結果,最後關閉資料庫連接,這樣的話會佔用較多的資源,而我們的PHP程式也因為要等待從資料庫中查詢而使得響應速度變慢。
第二點就是在資料庫壓力較大時,比如高峰時段,這個時候資料庫壓力大,我們就需要把一些資料存放區到硬碟上,用檔案的形式去讀取,這樣的做法是用我們的硬碟空間換取資料庫的壓力,這一點也要看機器效能。
第三點就是有些資料不著急去更新,比如上面提到的商品類型表,就不會太急於更新,比如我們的使用者的核心資訊,一般也不會輕易去修改密碼什麼的,這些內容可以選擇用檔案的形式去緩衝起來。
緩衝的實現原理
第一點就是我們要確定何時強制更新內容,最常見的有三種方式就是第一個就是用時間去觸發,我們通常使用時間戳,第二點就是探索資料庫資料被修改,則自動更新緩衝,第三個就是人工觸發,我們用人工的防水告訴資訊系統強制更新緩衝內容。
第二點就是我們可以通過使用serialize()函數來把從資料庫中取得的資料進行序列化,儲存為本地檔案,然後我們通過unserialize來從本地檔案中讀取資訊,所謂序列化就是用特定的方式去儲存PHP的值,它會保證部丟失這些值的類型和結構。
實戰示範
我們首先把從資料庫中讀取的資料存入本地檔案,代碼如下:
然後我們可以開啟這個sqlcache.txt檔案,它的內容如下:a:6:{i:0;a:4:{s:2:"id";s:1:"1";s:5:"level";s:1:"0";s:4:"name";s:6:"辛星";s:3:"pwd";s:32:"bd04fcc97578ce33ca5fb331f42bc375";}i:1;a:4:{s:2:"id";s:1:"2";s:5:"level";s:1:"1";s:4:"name";s:6:"小倩";s:3:"pwd";s:32:"61cb72858be523b9926ecc3d7da5d0c6";}i:2;a:4:{s:2:"id";s:1:"3";s:5:"level";s:1:"1";s:4:"name";s:6:"小楠";s:3:"pwd";s:32:"a3d2de7675556553a5f08e4c88d2c228";}i:3;a:4:{s:2:"id";s:1:"4";s:5:"level";s:1:"1";s:4:"name";s:6:"劉強";s:3:"pwd";s:32:"fcdb06a72af0516502e5fdccc9181ee0";}i:4;a:4:{s:2:"id";s:1:"5";s:5:"level";s:1:"1";s:4:"name";s:6:"星哥";s:3:"pwd";s:32:"866a6cafcf74ab3c2612a85626f1c706";}i:5;a:4:{s:2:"id";s:1:"6";s:5:"level";s:1:"1";s:4:"name";s:6:"辛勇";s:3:"pwd";s:32:"e93beb7663f3320eaa0157730d02dd0c";}}
然後我們可以寫一個程式從該檔案中讀取資料,PHP代碼如下:這樣我們的$result就是從本地的txt檔案中讀取的資料,而不是從資料庫中讀取的資料了,即我們類比了緩衝的使用。
說明:
1.我們通過filemtime來得到檔案的建立時間,可以用time來得到現在的時間,通過比較這個差值來決定是否要更新緩衝。
2.我們可以用unlink來強制的刪除檔案以清空資料緩衝