你可能真的不希望這樣做!
將緩存層添加到您的應用程序應該是上一個你做的事情之一。緩存可以發現代碼中的大量錯誤,既微妙又明顯。
如果你想提高你的代碼的性能,你應該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嗎?
無論使用哪個數據庫接口,您都不能在緩存實際語句句柄或結果集對象,只返回它們返回的數據。
爲什麼你需要緩存呢?如果它在某些函數中使用 - 爲什麼不緩存該函數的結果? – zerkms 2011-04-29 05:56:14
編寫更真實的查詢,在「SELECT UID FROM Users」中沒有任何內容需要緩存。 – 2011-04-29 05:56:17