【问题标题】:Cache dynamic page with Varnish使用 Varnish 缓存动态页面
【发布时间】:2017-08-18 22:44:02
【问题描述】:

我正在尝试在 Apache 服务器上缓存一个运行仪表板的页面,该仪表板显示通过使用 PHP 的 API 从 Salesforce 数据库中提取的信息。

动态如下,

clients->apache/php/sqlqueries->Salesforce

仪表板包含在重新加载 PHP 页面的表格中,其中包含查询 salesforce 的对象。

function refreshtable1() {
    $('#table1').load('/tables/table1.php', function() {
        setTimeout(refreshtable1, 60000);
    });
}

为了使查询发生,table1.php 包含一个查询对象和一个 Salesforce API 插件,在每次重新加载和查询时登录到 Salesforce。

登录返回一个会话 ID,该 ID 被放入会话中并重复使用直到过期。

现在,假设有 30 个用户,5 个表,每个表有 30 列,每个用户一个显示信息以便共享。

每 30 分钟刷新 2 个表,每分钟刷新 3 个。

如果您计算的数字可能会达到每天 100 万次查询,因为这些人一直在打开他们的浏览器。有一个会话处理程序会在一段时间后终止会话,但如果他们在回家之前刷新它,它会再运行 9 个小时。

Salesforce 管理员此时不太喜欢我。

所以我试图让某种系统或缓存卸载。还要避免必须有一个本地数据库,我将所有内容复制到该数据库中,并且从要填充的查询中读取的数据是每分钟 3 个。

这就是为什么我决定给 Varnish 缓存一个机会。

问题是我看到它没有将表格内容从缓存传递给客户端,它看起来确实呈现了 HTML 部分,但它不断从仪表板站点运行的后端服务器获取表格内容。

~# varnishstat -1 | grep "cache_hit \|cache_miss \|cache_hitpass"
MAIN.cache_hit                44         0.00 Cache hits
MAIN.cache_hitpass             0         0.00 Cache hits for pass.
MAIN.cache_miss            16436         0.59 Cache misses

我不确定这是否可能,所以我将不胜感激。

这是 Varnish conf,

sub vcl_recv {

    if (!(req.http.host == "test.local")) {
        unset req.http.Cookie;
    }

}

我基本上只是在尝试缓存所有 cookie 以保留“PHPSESSID”。我还尝试缓存 POST 和 GET 以防万一,但这也没有真正起到作用。

if (!(req.method  ~ "GET") && !(req.method  ~ "POST")) {
    return (pass);
}

关于如何让 Varnish 在这种情况下工作或如何减少使用另一种方法的查询的任何想法?

干杯。

【问题讨论】:

  • 从源头解决问题。缓存来自 Salesforce 的响应。例如使用 redis 或 memcache。如果您想继续使用 Varnish,请阅读 stackoverflow.com/questions/4273734/…,但它可能会产生非常糟糕的后果。
  • 无权访问后端,salesforce 管理员也无权访问,这就是问题所在,因此需要寻找中间或前端解决方案
  • 那你倒霉了。如果您需要保留 PHPSESSID 以便用户之间不共享响应,则无需缓存任何内容。即使您缓存每个用户的响应,它也违背了首先刷新表的目的,因为您将返回陈旧的数据。您可以通过降低 javascript 中的刷新率来达到同样的效果。
  • 完全正确,我猜更改刷新间隔会做同样的事情。我正在查看 Apache 中的 mod_mem_cache 以查看它是否有用。干杯。

标签: php apache caching salesforce varnish


【解决方案1】:

cmets 上的人说你不应该使用 Varnish 是对的,但如果你别无选择,那就去吧。我也用它来解决组织问题。

您可以更改 vcl_hash 函数以使用 cookie 作为缓存键的一部分,请查看 here。例如:

sub vcl_hash {
  hash_data(req.http.cookie);
}

你应该关注hash colisions。我相信您可以避免删除所有不希望用作密钥的 cookie。这个link中有一个例子。

祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2012-09-02
    • 2020-02-24
    相关资源
    最近更新 更多