我有一个缓存场景,我不确定如何解决。我能够毫无问题地缓存静态页面,但在动态页面上遇到一些麻烦。
在动态页面中,逻辑如下:
// part1的
- 页面请求的一些处理(第3部分需要)
-echo一些信息
// 2部分
echo用户特定菜单+一些用户特定信息
//第三部分
回声页面的其余部分
问题是,如果我缓存整个页面,然后读取缓存,那就不好了( part2将不正确,因为它取决于用户)。
缓存页面,我只是使用
“ob_start();”在文件的开头,然后将ob_get_contents()保存到文件然后“ob_end_flush();”最后。
如果文件已经存在于缓存中且未过期,我会这样做:“include(file);”和“退出;”
我尝试将缓存拆分为两个文件,但第2部分和第3部分依赖于part1的一些php处理我很难...
有没有人对如何解决这个问题有任何想法?如果我不是很清楚,请告诉我,我会重新提出这个问题。谢谢!
答案 0 :(得分:1)
如果可以,您应该使用APC(和/或Redis / Memcached)来缓存您的数据,因为它将更快 WAAAAAAAAAAAAAAAAY 一切都在 MEMORY )。如果您希望您的网站表现良好,您应该安装APC(MEMORY中的预编译字节代码)。
否则,您应该使用优秀的Cache_Lite库将数据缓存到文件中。 The introduction完美地解释了如何使用它。如果可能的话,您应该写信至/dev/shm/
,因为这会映射到 MEMORY ,这将比光盘IO快。
我尝试将缓存分成两部分 文件,但第2和第3部分取决于一些 php处理part1我有一个 艰难时期......
你应该拥有独特的作品(尽可能大,但有时难以跟踪),然后在页面上组合你需要的这些作品。每件作品都应该有一个独特的ID(用于检索)。
<?php
require_once('Cache/Lite.php');
$options = array(
'cacheDir' => '/tmp/',
'lifeTime' => 3600
);
// Create a Cache_Lite object
$Cache_Lite = new Cache_Lite($options);
if ($data = $Cache_Lite->get('#{ID for user specific menu}')) {
echo($data);
} else {
$data = 'Data of the block 1-1';
$Cache_Lite->save($data);
}
echo('<br><br>Non cached line !<br><br>');
if ($data = $Cache_Lite->get('#{user specific info}')) {
echo($data);
} else {
$data = 'Data of the block 2';
$Cache_Lite->save($data);
}
?>
答案 1 :(得分:0)
如果缓存“用户特定菜单”和“用户特定信息”背后的原因是为了防止查询数据库,您可以很好地缓存生成的查询而不是生成的HTML。
您还提到要缓存到文件中。您可能希望查看缓存服务器,例如memcached。这将减少文件系统的负载。
除非您在PHP代码中进行密集处理,或者如果您正在执行花费时间的查询,否则我不认为需要缓存PHP脚本输出的HTML。