【问题标题】:confusing file caching scenario令人困惑的文件缓存场景
【发布时间】:2011-01-17 04:09:24
【问题描述】:

我有一个不知道如何解决的缓存方案。我能够毫无问题地缓存静态页面,但在处理动态页面时遇到了一些问题。

在动态页面中,逻辑是这样的:

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

//第二部分
回显用户特定菜单 + 一些用户特定信息

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

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

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

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

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

【问题讨论】:

  • 您能解释一下为什么要缓存这个吗?是为了防止查询数据库吗?
  • 是的,它是为了防止查询数据库。我正在缓存查询,但也想缓存 html 以防止每个查询的所有缓存命中(有很多计数器被查询)。不幸的是,我目前无法使用 memcached。我根本不想缓存第 2 部分,我不介意每次都生成它,但我无法实现第 1 部分和第 3 部分的缓存并使它们一起工作。
  • 无论如何,我建议您编写一个函数来生成每个部分,并让该函数处理该部分的缓存。另外请记住,如果您还没有结束它们,则不能连续运行 ob_start
  • 代码有点棘手,我知道你不能连续运行ob_start,谢谢!

标签: php caching


【解决方案1】:

APC/Redis/Memcached

如果可以的话,你应该使用APC(和/或Redis/Memcached)来缓存你的数据,因为它会WAAAAAAAAAAAAAAAAY更快(一切都留在内存)。如果您希望您的网站运行良好,则无论如何都应该安装 APC(内存中的预编译字节码)。

Cache_Lite

否则,您应该使用出色的 Cache_Lite 库将数据缓存到文件中。 The introduction 完美地解释了如何使用它。如果可能的话,您应该写信给/dev/shm/,因为这会映射到 MEMORY,这将比 Disc IO 更快。

拆分缓存

我尝试将缓存分成两部分 文件,但第 2 部分和第 3 部分取决于某些 part1的php处理我有一个 辛苦了……

您应该有独特的部分(最好是尽可能大,但有时很难跟踪),然后在该页面上组合您需要的这些部分。每件作品都应该有一个唯一的离场 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);
}

?>

【讨论】:

  • 我认为 cache_lite 解决方案(分成两部分)最适合我的需要。我唯一担心的是,如果我现在这样做,将来我能否轻松切换到 memcached? cache_lite 包中是否有一种触发器,我可以说“$memory = true”,它会忽略“cacheDir”并切换将所有内容保存/加载到内存/从内存中加载?或者我是否需要再次进行一些代码更改并使用 memcached 函数存储两个不同的数据块?非常感谢。
  • 您应该为此编写一个包装器。 scribd.com/doc/4069180/… => 看看 cache_get function() 虽然你应该让它适用于 APC、memcached 和 Cache_lite
  • 哇,这完全是另一个级别的缓存.. apc/memcached/cache_lite 都用于不同的目的?如果我理解正确,cache_lite 是缓存页面内容(html),memcached 是用于数据库查询,APC 是缓存 PHP 代码?为了最大限度地提高性能,应该尽可能使用所有 3+?首先我们尝试从全局变量中获取缓存,然后我们可以尝试保存的 html,如果文件缓存过期,那么 APC 将与 memcached 一起启动,然后使用 Cache_Lite 创建一个新的 html 文件,对吗?我错过了什么吗?这有点令人困惑。看起来 FB 不使用 hd (cache_lite)。谢谢!
  • @Kentor Ofcourse FB 不使用 cache_lite。与MEMORY(MEM +- 80ns vs DISC +-5ms)相比,光盘非常慢。如果可以使用内存,则不应使用 cache_lite,但不能吗?现在,您只需要编写一个包装函数 cache_get ,它首先使用 GLOBAL 尝试,然后在底部使用 cache_lite 。 P.S:稍后如果我有时间我可能会更新我的答案。
  • 是的,你是对的,我目前不能,但希望项目能够增长。好的,如果您可以提供更多信息/示例(如果您有时间),那就太好了!非常感谢。我现在将尝试使用 cache_lite 方法,并让您知道它是否有效。再次感谢!
【解决方案2】:

如果缓存“用户特定菜单”和“用户特定信息”的原因是为了防止查询数据库,您可以很好地缓存结果查询而不是结果 HTML。

您还提到您正在缓存到文件中。您可能想要查看缓存服务器,例如 memcached。这将减少文件系统的负载。

除非您在 PHP 代码中进行密集处理,或者如果您正在执行需要时间的查询,否则我认为不需要缓存 PHP 脚本输出的 HTML。

【讨论】:

  • 我在问题 cmets 中添加了更多信息
猜你喜欢
  • 2011-10-12
  • 1970-01-01
  • 2020-08-18
  • 2013-11-08
  • 1970-01-01
  • 2018-05-28
  • 2018-03-21
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多