我正在尝试在 Apache 服务器上缓存一个页面,该页面运行仪表板,显示通过 API 和 PHP 从 Salesforce 数据库中提取的信息。
动态如下,
客户->apache/php/sqlqueries->Salesforce
仪表板由重新加载包含查询 salesforce 对象的 PHP 页面的表组成。
function refreshtable1() {
$('#table1').load('/tables/table1.php', function() {
setTimeout(refreshtable1, 60000);
});
}
为了发生这种查询,table1.php 包含一个查询对象和一个 salesforce API 插件,它们在每次重新加载和查询时登录到 Salesforce。
登录返回一个 session ID,该 ID 被放入 session 并重复使用直到过期。
现在,假设有 30 个用户,5 个表,每个表有 30 列,每个用户一个显示信息,以便可以共享。
每 30 分钟刷新 2 个表,每分钟刷新 3 个。
如果你做的数字可能高达每天 100 万次查询,因为这些人一直在打开浏览器。有一个 session 处理程序会在一段时间后终止 session ,但是如果他们在回家之前刷新该内容,它会再运行 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 在这种情况下工作或如何使用另一种方法减少查询的任何想法?
干杯。
最佳答案
评论中的人是对的,您不应为此使用Varnish,但如果您别无选择,请使用它。我也将其用作组织问题的解决方法。
您可以更改vcl_hash函数以将cookie用作缓存键的一部分,将其视为here。例如:
sub vcl_hash {
hash_data(req.http.cookie);
}
您应该注意hash colisions。我相信您可以避免删除所有您不想用作键的cookie。在link中有一个例子。
祝你好运。
关于php - 使用 Varnish 缓存动态页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45633488/