2013-04-01 52 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

想我明白了。将尝试按照您描述的步骤执行它。非常感谢哈米德。 –

相关问题