【问题标题】:Flat file caching with zero downtime零停机时间的平面文件缓存
【发布时间】:2012-01-10 06:15:26
【问题描述】:

每次将新内容发布到我的网站时,我都会为网站的前 5 页重新生成平面文件缓存。这很有效,并且大大减少了服务器负载。

问题在于,每次重新生成文件缓存时,我都会看到流量略有下降,这可能是因为在浏览该网站的约 2500 人中,有一些很小但不可忽略的百分比看到了一半生成的页面。

我想知道在 php 中生成这些缓存页面的更好方法是什么,不会有任何用户看到半写页面的风险。

编辑:

这是我的 .htaccess 文件中确定是否加载缓存文件的部分:

RewriteCond %{HTTP_COOKIE} (user)
RewriteRule (.*)? - [S=3] # Skip the below 2 lines if the above test passes
RewriteRule ^$ app/webroot/cache_static_html/cache_static_popular_results_1.php [L]
RewriteRule ^popular/page:([2-9])$ app/webroot/cache_static_html/cache_static_popular_results_$1.php [L]

【问题讨论】:

  • 你可以离线构建平面文件,然后在更改的页面上升的同时放置它吗?

标签: php caching


【解决方案1】:

当您执行清除缓存时,Symfony 也会遇到同样的问题。为了避免这个问题,我们预热了缓存。考虑以下几点:

  • 创建临时目录(一定要设置正确的权限):cache_temp

  • 添加代码以识别触发器。如果触发器可用,则将缓存目录设置为 cache_temp(而不是 cache_current)。通过 http 触发示例:http://mydomain.com?prewarm=1

  • 代码会知道在cache_temp而不是cache_current中生成所有缓存文件

  • 将 cache_current 重命名为 cache_old

  • 将 cache_temp 重命名为 cache_current

  • 删除cache_old

【讨论】:

  • 只是为了确保我理解,我会在开始整个重命名缓存/重命名操作之前将触发器设置为 1,然后再返回 0,以便我知道从 cache_temp 目录加载而手术正在发生吗?知道如何在我的 htaccess 规则中检查触发器(请参阅我在主帖上的编辑以了解我当前的 htaccess 规则)?这个想法是,如果应该为它们提供缓存文件,则根本不必加载我的框架,因此能够在 htaccess 中处理对某些触发器(或者如果缓存文件存在,文件元数据..)的检查将是理想的。
  • 触发器只会被传递,因此您的代码会知道请求了预热,因此您可以告诉您的框架在 cache_temp 目录而不是 cache_curent 目录中生成所有缓存文件。这样,所有缓存文件都可用并且可以使用,这样您就不会在负载过重的情况下提供部分缓存文件。
  • 不确定重写规则,我们所做的每个请求都会经过框架,然后框架会计算出要使用的缓存文件。
  • 看起来我可以使用您的方法,并在我的 htaccess 中使用“RewriteCond %{TIME_SEC}
【解决方案2】:

我建议也许使用 memcache 解决方案。似乎您可以很快地编写缓存,而不必使用平面文件方法。去回忆吧!

【讨论】:

  • 确保在缓冲给用户之前生成内容并缓存它。
  • 我使用 APC 为已登录的用户缓存网站的某些部分,但对于未登录的用户,我跳过加载整个网站框架 (cakephp)。在我的 htaccess 中,我让它检查“用户”cookie 是否存在,如果不存在,它会重写到主页的缓存文件。
猜你喜欢
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多