令人困惑的文件缓存方案

时间:2011-01-17 04:09:25

标签: php caching

我有一个缓存场景,我不确定如何解决。我能够毫无问题地缓存静态页面,但在动态页面上遇到一些麻烦。

在动态页面中,逻辑如下:

// part1的
- 页面请求的一些处理(第3部分需要)
-echo一些信息

// 2部分
echo用户特定菜单+一些用户特定信息

//第三部分
回声页面的其余部分

问题是,如果我缓存整个页面,然后读取缓存,那就不好了( part2将不正确,因为它取决于用户)。

缓存页面,我只是使用 “ob_start();”在文件的开头,然后将ob_get_contents()保存到文件然后“ob_end_flush();”最后。
如果文件已经存在于缓存中且未过期,我会这样做:“include(file);”和“退出;”

我尝试将缓存拆分为两个文件,但第2部分和第3部分依赖于part1的一些php处理我很难...

有没有人对如何解决这个问题有任何想法?如果我不是很清楚,请告诉我,我会重新提出这个问题。谢谢!

2 个答案:

答案 0 :(得分:1)

APC / Redis的/ Memcached的

如果可以,您应该使用APC(和/或Redis / Memcached)来缓存您的数据,因为它将更快 WAAAAAAAAAAAAAAAAY 一切都在 MEMORY )。如果您希望您的网站表现良好,您应该安装APC(MEMORY中的预编译字节代码)。

Cache_Lite

否则,您应该使用优秀的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。