我试图在Apache服务器上缓存一个页面,该页面运行一个仪表板,显示通过PHP通过API从Salesforce数据库中拉出的信息。
动态如下,
客户端->apache/php/sqlqueries>Salesforce
仪表板包含在重新加载PHP页面的表中,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会议,
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在这种情况下工作,或者如何用另一种方法减少查询,有什么想法吗?
干杯。
发布于 2017-08-18 22:44:03
评论上的人是对的,你不应该使用Varnish,但如果你没有任何选择,那就去做吧。我也使用它作为组织问题的变通方法。
您可以更改vcl_hash函数以使用cookie作为缓存键的一部分,请查看它的here。例如:
sub vcl_hash {
hash_data(req.http.cookie);
}你应该注意hash colisions。我相信你可以避免它删除所有的cookie,而不是你想要使用的关键。在这个link中有一个这样的例子。
祝好运。
https://stackoverflow.com/questions/45633488
复制相似问题