首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Varnish缓存动态页面

使用Varnish缓存动态页面
EN

Stack Overflow用户
提问于 2017-08-11 18:55:37
回答 1查看 854关注 0票数 1

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

动态如下,

客户端->apache/php/sqlqueries>Salesforce

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

代码语言:javascript
复制
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部分,但它一直从运行仪表板站点的后端服务器获取表内容。

代码语言:javascript
复制
~# 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会议,

代码语言:javascript
复制
sub vcl_recv {

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

}

我只是尝试缓存所有的cookie来保持'PHPSESSID‘。我也尝试过缓存POST和GET以防万一,但这也没有真正起到作用。

代码语言:javascript
复制
if (!(req.method  ~ "GET") && !(req.method  ~ "POST")) {
    return (pass);
}

关于如何让Varnish在这种情况下工作,或者如何用另一种方法减少查询,有什么想法吗?

干杯。

EN

回答 1

Stack Overflow用户

发布于 2017-08-18 22:44:03

评论上的人是对的,你不应该使用Varnish,但如果你没有任何选择,那就去做吧。我也使用它作为组织问题的变通方法。

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

代码语言:javascript
复制
sub vcl_hash {
  hash_data(req.http.cookie);
}

你应该注意hash colisions。我相信你可以避免它删除所有的cookie,而不是你想要使用的关键。在这个link中有一个这样的例子。

祝好运。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45633488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档