2013-04-01 53 views
11

每次在我list.php?id=xxxxx它再次查詢一些MySQL的查詢返回該頁面的人登陸:使用PHP緩存MySQL查詢結果的最簡單方法是什麼?

$ids = array(..,..,..); // not big array - not longer then 50 number records 
$thumbs = array(..,..,..); // not big array - not longer then 50 text records 
$artdesc = "some text not very long"; // text field 

因爲從中我讓查詢數據庫是相當大的,我想緩存此結果24h內也許文件如:xxxxx.php在/ cache /目錄中,所以如果存在,我可以在include("xxxxx.php")中使用它。 (或txt文件!?,或任何其他方式)

因爲有非常簡單的數據,我相信它可以使用幾個PHP線和無需使用的memcached或其他專業對象來完成。

具有因我的PHP是非常有限的有人可以只需將此任務的PHP主線(或代碼)?

我真的會非常心存感激!

+0

我已經修改了爲24小時緩存有效性添加解決方案的答案。請參閱http://stackoverflow.com/a/15748442/369005 –

回答

8

緩存PHP數組是很容易的:

file_put_contents($path, '<?php return '.var_export($my_array,true).';?>'); 

然後你就可以讀回了:

if (file_exists($path)) $my_array = include($path); 

您可能還需要look into ADOdb,其內部提供緩存。

+0

非常感謝您採取這種方式來解決此問題。它確實指出我爲我的案例建立一個簡單的解決方案! –

0

只要寫一個新的文件與$ _GET [「身份證」]和你想緩存的東西的內容,每一次檢查的名稱,查看該文件是否存在,否則創建一個。像這樣:

$id = $_GET['id'] 

if (file_exists('/a/dir/' . $id)) { 
    $data = file_get_contents('/a/dir/' . $id); 
} else { 
    //do mysql query, set data to result 
    $handle = fopen('/a/dir/' . $id, 'w+'); 
    fwrite($handle, $data); 
    fclose($handle); 
} 
+3

然後有人用'script.php?id = ../../etc/passwd'或其他有趣的東西來調用你的腳本。清理用戶輸入... – DCoder

+0

Ty lemondrop;因爲我知道文件本身沒有任何擴展名,對吧? 如何將我的3個項目(2個數組+ 1個變量)放在$ data中? 此外,如果你可以提供我的方式來檢查24小時緩存,這將是偉大的! –

5

嘗試使用序列化;

假設你在兩個數組$array1$array2讓您的數據。現在你需要做的是將這些數組存儲在文件中。將字符串(問題中的第三個變量)存儲到文件很容易,但要存儲數組,您必須先將其轉換爲字符串。

$string_of_array1 = serialize($array1); 
$string_of_array2 = serialize($array2); 

下一個問題是緩存文件的命名,以便您可以輕鬆地檢查相關陣列是否已在緩存中可用。做到這一點的最好方法是創建一個你的mysql查詢的MD5哈希值並將其用作緩存文件名。

$cache_dir = '/path/cache/'; 

$query1 = 'SELECT many , fields FROM first_table INNER JOIN another_table ...'; 
$cache1_filename = md5($query1); 

if(file_exists($cache_dir . $cache1_filename)) 
{ 
    if(filemtime($cache_dir . $cache1_filename) > (time() - 60 * 60 * 24)) 
    { 
     $array1 = unserialize(file_get_contents($cache_dir . $cache1_filename)); 
    } 
} 

if(!isset($array1)) 
{ 
    $array1 = run_mysql_query($query1); 
    file_put_contents(serialize($array1)); 
} 

用另一個應該存儲在另一個文件中的數組重複上述操作,第二個查詢的MD5用作第二個緩存文件的名稱。

最後,你必須決定你的緩存應如何保持有效。對於相同的查詢,可能會更改您的mysql表中的記錄,這可能會導致文件系統緩存過期。所以,你不能只依靠唯一的文件名來進行獨特的查詢。

重要:

  • 舊的緩存文件都將被刪除。您可能必須編寫一個例程來檢查目錄中的所有文件,並刪除超過n秒的文件。
  • 將緩存目錄保留在webroot之外。
+0

想我明白了。將嘗試按照您描述的步驟執行它。非常感謝哈米德。 –

相關問題