【发布时间】: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