php快取查詢請求

2021-05-23 17:23:09 字數 3047 閱讀 5524

快取sql查詢結果

為什麼要快取查詢結果?

快取查詢結果能極大地改進指令碼執行時間和資源需求。

快取sql查詢結果也允許你通過後期處理資料。如果你用檔案快取去儲存全部指令碼的輸出結果(html輸出),這樣可能是行不通的。

當你執行乙個sql查詢時,點典的處理過程是:

l        

連線資料庫

l        

準備sql查詢

l        

傳送查詢到資料庫

l        

取得返回結果

l        

關閉資料庫連線

以上方法非常占用資源並且相反的影響了指令碼的效能。只能通過取得的大量返回資料和資料庫伺服器的位置這二個要素來相互協調。儘管持續連線可以改進連線資料庫時的負載,但非常耗費記憶體資源,如果獲取的是大量的資料,那麼儲存的全部時間會非常短暫。

建立一條sql查詢:

sql(結構化查詢語言)查詢被用作運算元據庫及它內容的介面。sql可用於定義和編輯表的結構,插入資料到表,更新或刪除表中的資訊。

sql是用於與資料通訊的語言,在大多數php資料庫擴充套件(mysql,odbc,oracle等)通過傳遞sql查詢到資料庫中來管理整個過程。

本教程中,僅僅用select語言來獲取資料庫中的資料。這些資料將被快取,之後將用作資料來源。

決定什麼時候更新快取:

根據程式的需要,快取可以採取多種形式。最常見的3種方式是:

l        

時間觸發快取(過期的時間戳)

l        

內容改變觸發快取(發現資料改變後,相應地更新快取)

l        

人工觸發快取(人工的方式告知系統資訊超期並且強制產生新的快取)

你的快取需求可能是以上原理的乙個或多個的綜合。本教程將討論時間觸發方式。然而,在乙個全面的快取機制中,3種方式的綜合將被使用。

快取結果:

基本的快取是用php的兩個函式serialize()和unserialize()(譯註:這二個函式分別代表序列化與反序列化)。

函式serialize()用於儲存php的值,它能保證不失去這些值的型別和結構。

事實上,php的session擴充套件是用序列化過的變數,把session變數($_session)儲存在系統的乙個檔案中。

函式unserialize()與以上操作相反並且使序列化過的字串返回到它原來的結構和資料內容。

在本例中,以乙個電子商務商店為例。商店有2個基本表,categories和products(此處為原始資料庫表名).product表可能每天都在變化,categories仍然是不變靜止的。

要顯示產品,你可以用乙個輸出快取指令碼來儲存輸出的html結果到乙個檔案中。然而categories表可能需要後期處理。例如,所有的目錄通過變數category_id(通過$_request['category_id']來取得)被顯示,你可能希望高亮當前被選擇的目錄。

表categories結構

field

type 

keyextra

category_id

category_name

category_description

int(10) unsigned

varchar(255)

text

priauto_incremen

在本例中,通過時間觸發快取技術被運用,設定一段時間後讓其快取sql輸出過期。在此特殊的例子中,定一段時間為24小時。

序列化例子:

l        

連線資料庫

l        

執行查詢

l        

取得所有結果構成乙個陣列以便後面你可以訪問

l        

序列化陣列

l        

儲存序列化過的陣列到檔案中

檢視sql_cache.txt檔案,裡面的內容可能類似這樣的:

a:1:}

這個輸出是它的變數和型別的內部表現形式。假若你用mysql_fetch_array()函式返回數字索引的陣列和乙個關聯的陣列(這就是為什麼資料看起來像是發生了兩次),乙個是數字索引,另乙個是字串索引。

使用快取:

要用快取,你需要用函式unserialize()來使資料還原成原始格式與型別。

你可以用file_get_contents()這個函式來讀取sql_cache.txt檔案的內容,把它賦給乙個變數。

請注意:這個函式在php4.3.0及以上版本有效。若你使用的是乙個老版本的php,乙個簡單的方法是用file()函式(讀整個檔案到乙個陣列,每行變成乙個陣列)。implode()函式用於把陣列的各元素連線成乙個字串然後使用unserialize()反序列化。

// file_get_contents() 適合於for php < 4.3.0

注意$records是陣列(乙個包含了查詢結果的數字索引列——每行是乙個數字和乙個字串...真是混亂)的一排。

把它們放在一塊:

基於本例子中的時間來決定是否快取。如果檔案修改的時間戳比當前時間戳減去過期時間戳大,那麼就用快取,否則更新快取。

l        

檢查檔案是否存在並且時間戳小於設定的過期時間

l        

獲取儲存在快取檔案中的記錄或者更新快取檔案

附加其它可能的:

l        

把快取結果儲存在共享記憶體中以獲取更快的速度

l        

增加乙個功能隨機地執行sql查詢並且檢查是否輸出與快取輸出一致。如果不一致,則更新快取(本函式執行次數的概率可以定為1/100)。通過雜湊演算法(如md5())可以協助判斷字串或者檔案是否改變。

l        

增加乙個管理員的功能,人工的刪除這個快取檔案,以強制更新快取(如file_exists()函式返回false時)。你可以用函式unlink()刪除檔案。

指令碼:

mysql資料快取查詢 Mysql查詢快取

查詢快取 mysql提供了一種快取型別,會快取整個select查詢結果。mysql查詢快取儲存查詢返回的完整結果。當查詢命中該快取,mysql會立即返回結果,跳過了解析 優化和執行階段。以下兩種情況不能被快取 頻繁更新 修改的的表,所有快取資料都會失效,mysql查詢快取會跟蹤查詢中涉及的表,如果這...

npm快取查詢和bug解決

npm config edit.npmrc配置檔案位址 npm config listnpm config get cachenpm config get prefix或者 npm root gnpm config set prefix npm config set cache 1.關於npm ca...

MyBatis從快取查詢資料的依據

mybatis的查詢依據是 sql的id sql語句。hibernate的查依據是 查詢結果物件的id。快取的底層實現是乙個map,map的value是查詢結果。map的key,即查詢依據,使用的orm架構不同,查詢依據就不不同。快取的底層實現是乙個map,map的value是查詢結果 map的ke...