繁体   English   中英

使用Varnish缓存动态页面

[英]Cache dynamic page with Varnish

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

动态如下:

客户端-> Apache / PHP / SQLQUERY-> Salesforce

仪表板包含一些表,这些表可重新加载包含查询salesforce对象的PHP页面。

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

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

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

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

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

如果您这样做的话,每天都会有多达一百万的查询,因为这些家伙一直在打开浏览器。 有一个会话处理程序会在一段时间后终止会话,但是如果他们在回家之前刷新了东西,它将再运行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在这种情况下工作或如何通过其他方法减少查询的任何想法?

干杯。

评论中的人是对的,您不应为此使用Varnish,但如果您别无选择,请使用它。 我也将其用作组织问题的解决方法。

您可以更改vcl_hash函数以将cookie用作缓存键的一部分,请在此处查看 例如:

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

您应该注意哈希菌 我相信您可以避免删除所有不希望用作键的cookie。 链接中有一个示例。

祝好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM