每当有人登陆我的页面list.php?id=xxxxx
时,它会重新查询一些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
因为我从中进行查询的数据库非常大,所以我希望将这个结果缓存24小时,或者像/ {/ 1}}这样的文件在/ cache /目录中,这样我就可以在{{1如果它存在。 (或txt文件!?或任何其他方式)
因为有非常简单的数据,我相信可以使用一些PHP行来完成,不需要使用memcached或其他专业对象。
如果我的PHP非常有限,有人可以只为这个任务放置PHP主线(或代码)吗?
我真的非常感谢!
答案 0 :(得分:8)
缓存PHP数组非常简单:
file_put_contents($path, '<?php return '.var_export($my_array,true).';?>');
然后你可以把它读出来:
if (file_exists($path)) $my_array = include($path);
您可能还需要look into ADOdb,它在内部提供缓存。
答案 1 :(得分: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表中的记录,这些记录可能会使您的文件系统缓存过期。因此,您不能仅依靠唯一的文件名来进行独特的查询。
重要:强>
答案 2 :(得分:0)
只需编写一个名为$ _GET ['id']的新文件以及要缓存的内容,每次检查该文件是否存在,否则创建一个。像这样:
$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);
}