2011-04-29 119 views
1

我需要一個工作代碼用於在APC緩存中存儲MySQL結果集!
我搜索谷歌&所以沒有找到任何!
希望有人會分享一個工作代碼。緩存MySQL結果集

例子:

$stmt=mysqli_prepare($con,"SELECT UID FROM Users"); 
mysqli_stmt_execute($stmt); 
mysqli_stmt_bind_result($stmt, $UID); 
mysqli_stmt_fetch($stmt); 
mysqli_stmt_close($stmt); 

例2:

$stmt=mysqli_prepare($con,"SELECT Events FROM Calendar where UID=?"); 
mysqli_stmt_bind_result($stmt, "i",$UID); 
mysqli_stmt_execute($stmt); 
mysqli_stmt_bind_result($stmt, $events); 
while(mysqli_stmt_fetch($stmt)) 
{ 
    ... 
} 
mysqli_stmt_close($stmt); 

如何儲存在APC的outcoming SQL結果?

我想知道的代碼它緩存在APC(未在MySQL)

+1

爲什麼你需要緩存呢?如果它在某些函數中使用 - 爲什麼不緩存該函數的結果? – zerkms 2011-04-29 05:56:14

+0

編寫更真實的查詢,在「SELECT UID FROM Users」中沒有任何內容需要緩存。 – 2011-04-29 05:56:17

回答

4

你可能真的不希望這樣做!

將緩存層添加到您的應用程序應該是上一個你做的事情之一。緩存可以發現代碼中的大量錯誤,既微妙又明顯。

如果你想提高你的代碼的性能,你應該performing code profiling和消除真正瓶頸,而不是感覺到的。

特別是在這種情況下。

您的示例查詢是不好的。可怕,甚至。您正在從表的列中獲取UID列,未能爲這些行指定順序,然後僅實際獲取第一行,無論它們是哪一個。

即使使用此查詢,甚至不考慮緩存它,是危險的。 如果這是一個真正的查詢,那麼你的代碼是開始!從數據庫返回的結果是而不是保證以任何特定的順序。事實上,至少在MySQL中,你可以使用ALTER TABLE ... ORDER BY實際上重置磁盤數據訂購。如果您只需要一行,則應該使用ORDER BY子句和LIMIT子句,而不是選擇全部,然後僅取出一行。

我要去,你已經過於簡單的查詢作爲例子的假設下進行操作,並且將幽默與您在您需要知道兩種三個APC功能的快速入門。您應該閱讀其他功能的全部的手冊頁,以瞭解APC的工作原理。

讓我們來看看你的代碼。

$stmt=mysqli_prepare($con,"SELECT UID FROM Users"); 
mysqli_stmt_execute($stmt); 
mysqli_stmt_bind_result($stmt, $UID); 
mysqli_stmt_fetch($stmt); 
mysqli_stmt_close($stmt); 

在這段代碼中,你準備查詢SELECT UID FROM Users,結合結果集到PHP變量$UID的第一列,取單行,然後關閉語句句柄(放棄所有其他的結果)。

$UID包含要緩存的單個值。緩存在APC這個值,你可以使用apc_store

apc_store($key, $UID); 

$key是緩存鍵名。

當然,如果你需要的話,把它放入緩存是很愚蠢的,例如只查詢數據庫。我們可以使用apc_fetch先查找緩存的值。

$value_in_cache = false; 
$value = apc_fetch($key, $value_in_cache); 
if(!$value_in_cache) { 
    $value = null; 
    $stmt = mysqli_prepare($con,"SELECT UID FROM Users"); 
    mysqli_stmt_execute($stmt); 
    mysqli_stmt_bind_result($stmt, $value); 
    mysqli_stmt_fetch($stmt); 
    mysqli_stmt_close($stmt); 
    apc_store($key, $value); 
} 

該代碼會一直嘗試並查詢數據庫,它更可能你想完成什麼之前拉$key從緩存中。請注意,我有意在這裏暫停緩存過期時間。

你會注意到,顯然只有一個值被緩存在這裏。如果你堅持上使用綁定的結果變量,那麼你要麼需要手動建立一個數組並緩存該數組。我強烈建議使用綁定變量而不是。看看使用mysql_stmt_get_result來獲取result set,然後你可以從中獲取數組。 小心,該手冊說get_result返回布爾值,但它已返回示例代碼中的結果集對象。因人而異。我可以爲您的未來項目建議PDO嗎?

無論使用哪個數據庫接口,您都不能在緩存實際語句句柄或結果集對象,只返回它們返回的數據。

+0

好帖子:| +1,我可以以相同的方式將數組添加到緩存中嗎? – Sourav 2011-04-29 07:39:49

+0

任何可以序列化的東西都可以卡在APC緩存中。 – Charles 2011-04-29 07:47:04

0

這裏是工作的代碼:)

<?php 
$dba_host='localhost'; 
$dba_name='root'; 
$dba_pass=''; 
$dba_db='DB'; 

$con=mysqli_connect($dba_host,$dba_name,$dba_pass,$dba_db) or die('Connection Refused !'); 

$stmt=mysqli_prepare($con,"SELECT UID FROM Main"); 
mysqli_stmt_execute($stmt); 
mysqli_stmt_bind_result($stmt, $value); 
while(mysqli_stmt_fetch($stmt)) 
$result[] = $value; 
mysqli_stmt_close($stmt); 
apc_store('uid', $result); 


$value_in_cache = false; 
$value = apc_fetch('uid', $value_in_cache); 
if(!$value_in_cache) { 
echo 'Looking at DB'; 
$stmt=mysqli_prepare($con,"SELECT UID FROM Main"); 
mysqli_stmt_execute($stmt); 
mysqli_stmt_bind_result($stmt, $value); 
while(mysqli_stmt_fetch($stmt)) 
    $result[] = $value; 
mysqli_stmt_close($stmt); 
apc_store('uid', $result); 
} 
else 
{ 
echo 'Looking at Memory'; 
print_r($result); 
} 

mysqli_close($con); 
?>