亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

php數據庫緩存實現思路

2020-03-22 18:45:47
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了關于php數據庫緩存實現思路,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

緩存SQL查詢結果

為什么要緩存查詢結果?

緩存查詢結果能極大地改進腳本執行時間和資源需求。

緩存SQL查詢結果也允許你通過后期處理數據。如果你用文件緩存去存儲全部腳本的輸出結果(HTML輸出),這樣可能是行不通的。

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

<!--[if !supportLists]-->l <!--[endif]-->連接數據庫

<!--[if !supportLists]-->l <!--[endif]-->準備SQL查詢

<!--[if !supportLists]-->l <!--[endif]-->發送查詢到數據庫

<!--[if !supportLists]-->l <!--[endif]-->取得返回結果

<!--[if !supportLists]-->l <!--[endif]-->關閉數據庫連接

以上方法非常占用資源并且相反的影響了腳本的性能。只能通過取得的大量返回數據和數據庫服務器的位置這二個要素來相互協調。盡管持續連接可以改進連接數據庫時的負載,但非常耗費內存資源,如果獲取的是大量的數據,那么存儲的全部時間會非常短暫。

創建一條SQL查詢:

SQL(結構化查詢語言)查詢被用作操作數據庫及它內容的接口。SQL可用于定義和編輯表的結構,插入數據到表,更新或刪除表中的信息。

SQL是用于與數據通訊的語言,在大多數PHP數據庫擴展(html' target='_blank'>MySQL,ODBC,Oracle等)通過傳遞SQL查詢到數據庫中來管理整個過程。

本教程中,僅僅用select語言來獲取數據庫中的數據。這些數據將被緩存,之后將用作數據源。

決定什么時候更新緩存:

根據程序的需要,緩存可以采取多種形式。最常見的3種方式是:

<!--[if !supportLists]-->l <!--[endif]-->時間觸發緩存(過期的時間戳)

<!--[if !supportLists]-->l <!--[endif]-->內容改變觸發緩存(發現數據改變后,相應地更新緩存)

<!--[if !supportLists]-->l <!--[endif]-->人工觸發緩存(人工的方式告知系統信息超期并且強制產生新的緩存)

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

緩存結果:

基本的緩存是用PHP的兩個函數serialize()和unserialize()(譯注:這二個函數分別代表序列化與反序列化)。

函數serialize()用于存儲PHP的值,它能保證不失去這些值的類型和結構。

事實上,PHP的session擴展是用序列化過的變量,把session變量($_SESSION)存儲在系統的一個文件中。

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

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

要顯示產品,你可以用一個輸出緩存腳本來存儲輸出的HTML結果到一個文件中。然而categories表可能需要后期處理。例如,所有的目錄通過變量category_id(通過$_REQUEST['category_id']來取得)被顯示,你可能希望高亮當前被選擇的目錄。

表categories結構

FieldType KeyExtracategory_idcategory_namecategory_descriptionint(10) unsignedvarchar(255)textPRIauto_incremen

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

序列化例子:

<!--[if !supportLists]-->l <!--[endif]-->連接數據庫

<!--[if !supportLists]-->l <!--[endif]-->執行查詢

<!--[if !supportLists]-->l <!--[endif]-->取得所有結果構成一個數組以便后面你可以訪問

<!--[if !supportLists]-->l <!--[endif]-->序列化數組

<!--[if !supportLists]-->l <!--[endif]-->保存序列化過的數組到文件中

[php] view plaincopy

$file = 'sql_cache.txt';  $link = mysql_connect('localhost','username','password')      or die (mysql_error());  mysql_select_db('shop')      or die (mysql_error());  /* 構造SQL查詢 */  $query = "SELECT * FROM categories";  $result = mysql_query($query)      or die (mysql_error());  while ($record = mysql_fetch_array($result) )  {      $records[] = $record;  }  $OUTPUT = serialize($records);  $fp = fopen($file,"w"); // 以寫權限的方式打開文件fputs($fp, $OUTPUT);  fclose($fp);

查看sql_cache.txt文件,里面的內容可能類似這樣的:

a:1:{i:0;a:6:{i:0;s:1:"1";s:11:"category_id";s:1:"1";i:1;s:9:"Computers";s:13:"category_name";s:9:

"Computers" ;i:2;s:25:"Description for computers";s:20:"category_description"

;s:25:"Description for computers";}}

這個輸出是它的變量和類型的內部表現形式。假若你用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

[php] view plaincopy

$file = 'sql_cache.txt';  $records = unserialize(implode('',file($file)));  //現在你可以通過$records數組并且取得原始查詢的數據:  foreach ($records as $id=>$row) {      print $row['category_name']."<br>";  }

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

把它們放在一塊:

基于本例子中的時間來決定是否緩存。如果文件修改的時間戳比當前時間戳減去過期時間戳大,那么就用緩存,否則更新緩存。

<!--[if !supportLists]-->l <!--[endif]-->檢查文件是否存在并且時間戳小于設置的過期時間

<!--[if !supportLists]-->l <!--[endif]-->獲取存儲在緩存文件中的記錄或者更新緩存文件

[php] view plaincopy

$file = 'sql_cache.txt';  $expire = 86400; // 24 小時 (單位:秒)if (file_exists($file) &&   filemtime($file) > (time() - $expire))  {      // 取得緩存中的記錄      $records = unserialize(file_get_contents($file));  } else {      // 通過 serialize() 函數創建緩存  }

附加其它可能的:

<!--[if !supportLists]-->l <!--[endif]-->把緩存結果存儲在共享內存中以獲取更快的速度

<!--[if !supportLists]-->l <!--[endif]-->增加一個功能隨機地運行SQL查詢并且檢查是否輸出與緩存輸出一致。如果不一致,則更新緩存(本函數運行次數的概率可以定為1/100)。通過哈希算法(如MD5())可以協助判斷字符串或者文件是否改變。

<!--[if !supportLists]-->l <!--[endif]-->增加一個管理員的功能,人工的刪除這個緩存文件,以強制更新緩存(如file_exists()函數返回false時)。你可以用函數unlink()刪除文件。

腳本:

[php] view plaincopy

$file = 'sql_cache.txt';  $expire = 86400; // 24 小時if (file_exists($file) &&      filemtime($file) > (time() - $expire)) {      $records = unserialize(file_get_contents($file));  } else {      $link = mysql_connect('localhost','username','password')          or die (mysql_error());      mysql_select_db('shop')          or die (mysql_error());      /* 構造SQL查詢 */      $query = "SELECT * FROM categories";      $result = mysql_query($query)          or die (mysql_error());      while ($record = mysql_fetch_array($result) ) {          $records[] = $record;      }      $OUTPUT = serialize($records);      $fp = fopen($file,"w");      fputs($fp, $OUTPUT);      fclose($fp);  } // end else     // 查詢結果在數組 $records 中  foreach ($records as $id=>$row) {      if ($row['category_id'] == $_REQUEST['category_id']) {          // 被選擇的目錄顯示粗體字          print '<B>'.$row['category_name'].'</B><BR>';      } else {          // 其它目錄顯示用常規字體          print $row['category_name'].'<br>';      }  } // end foreach


以上就是php數據庫緩存實現思路的詳細內容,更多請關注 其它相關文章!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美二区在线播放| 91精品国产综合久久香蕉的用户体验| 欧美最顶级丰满的aⅴ艳星| 国产欧美精品一区二区| 高清在线视频日韩欧美| 成人黄色短视频在线观看| 亚洲第一精品久久忘忧草社区| 久久久久999| 日韩中文在线观看| 欧美午夜片在线免费观看| 亚洲自拍小视频免费观看| 久久久久久香蕉网| 亚洲视频axxx| 性亚洲最疯狂xxxx高清| 久久久久久91香蕉国产| 精品爽片免费看久久| 红桃av永久久久| 亚洲一区二区少妇| 亚洲乱亚洲乱妇无码| 久久精品视频免费播放| 欧美午夜电影在线| 欧美大片免费观看在线观看网站推荐| 色婷婷综合久久久久| 51视频国产精品一区二区| 成人久久一区二区| 亚洲午夜小视频| 久久不射热爱视频精品| 日韩av不卡电影| 久久九九国产精品怡红院| 国产成人精品日本亚洲| 久久久久久久久久国产精品| 久久免费视频在线观看| 色播久久人人爽人人爽人人片视av| 日韩欧美一区二区三区| 97国产精品人人爽人人做| 国产va免费精品高清在线| 欧美成人在线影院| 亚洲人午夜色婷婷| 久久久人成影片一区二区三区| 俺去啦;欧美日韩| 欧美激情中文字幕乱码免费| 国产精品欧美一区二区三区奶水| 中文欧美在线视频| 日韩在线高清视频| 91超碰caoporn97人人| 精品无人区乱码1区2区3区在线| 欧美日韩性生活视频| 亚洲国产日韩欧美综合久久| 97在线视频一区| 国产成人一区二区三区| 91禁外国网站| 久久久久久久999| 国产精品日韩欧美| 91在线观看欧美日韩| 97人人做人人爱| 国产欧美欧洲在线观看| 亚洲精品国产精品国自产观看浪潮| 欧美久久精品午夜青青大伊人| 亚洲美女福利视频网站| 97精品国产91久久久久久| 日韩欧美在线网址| 综合欧美国产视频二区| 亚洲国产91色在线| 欧美在线一级va免费观看| 亚洲а∨天堂久久精品喷水| 日韩在线精品视频| 欧美情侣性视频| 狠狠躁夜夜躁人人躁婷婷91| 日本精品免费观看| 亚洲欧洲国产精品| 成人黄色在线观看| 国产精品国产自产拍高清av水多| 不卡av在线播放| 乱亲女秽乱长久久久| 久久久久久久久网站| 国产免费一区二区三区在线观看| 亚洲精品天天看| 欧美香蕉大胸在线视频观看| 国产日韩在线精品av| 成人精品久久一区二区三区| 国产精品一区二区av影院萌芽| 欧美国产日韩一区二区在线观看| 全亚洲最色的网站在线观看| 亚洲2020天天堂在线观看| 欧美黑人又粗大| 91日本在线观看| 国产亚洲精品久久| 日韩精品免费在线播放| 国产一区红桃视频| 在线视频亚洲欧美| 欧美裸体xxxx极品少妇| 欧美大秀在线观看| 精品调教chinesegay| 日韩欧美在线观看| 国产欧美精品日韩| 欧美成人精品在线观看| 亚洲一区二区三区视频| 亚洲已满18点击进入在线看片| 欧美电影免费观看| 国产美女被下药99| 欧美日韩国产成人在线观看| 欧美性猛交xxxx富婆| 国产成人+综合亚洲+天堂| 国产精品久久久久久久久久久新郎| 中文字幕日韩欧美精品在线观看| 国产色婷婷国产综合在线理论片a| 一区二区三区美女xx视频| 午夜精品一区二区三区在线播放| 亚洲乱码国产乱码精品精天堂| 欧美一级片久久久久久久| 久久久成人av| 亚洲欧美一区二区激情| 欧美黑人xxxⅹ高潮交| 国产精品亚洲自拍| 91探花福利精品国产自产在线| 亚洲欧洲视频在线| 日韩av在线网址| 日韩欧美亚洲综合| 国产成人精品网站| 欧美性猛交xxxx黑人猛交| 亚洲成人aaa| 欧美精品在线免费| 欧洲精品毛片网站| 国产亚洲精品91在线| 日韩欧美精品在线观看| 日本高清视频一区| 国产男人精品视频| 亚洲乱码一区二区| 日韩高清中文字幕| 久久久久久久久久久成人| 国产精品18久久久久久首页狼| 国模精品视频一区二区三区| 国产精品视频永久免费播放| 欧美国产日韩一区二区三区| 精品免费在线观看| 91久久中文字幕| 国产精品久久久久久久久久99| 97久久久免费福利网址| 狠狠躁天天躁日日躁欧美| 日韩av片永久免费网站| 精品久久久久人成| 亚洲无限av看| 97精品国产aⅴ7777| 狠狠综合久久av一区二区小说| 国产日韩精品视频| 欧美男插女视频| 中文字幕亚洲字幕| 欧美在线一区二区视频| 97av在线视频| 国产精品欧美久久久| 亚洲国产高潮在线观看| 97色伦亚洲国产| 欧美性猛交99久久久久99按摩| 国产视频丨精品|在线观看| 全球成人中文在线| 日韩女在线观看| 国产日韩欧美视频在线| 日韩精品免费在线播放| 国产一区二区日韩| 亚洲国产欧美自拍| 亚洲国产另类久久精品| 亚洲黄色成人网| 亚洲精品美女视频| 欧美成人精品在线视频|