2017-08-11 113 views
1

我想要在Apache服务器上缓存运行仪表板的页面,该页面显示通过API使用API​​从Salesforce数据库中提取的信息。使用清漆缓存动态页面

动态如下,

clients->阿帕奇/ PHP/sqlqueries->的Salesforce

仪表板在于重新加载包含查询销售人员对象PHP页面表。

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

对于查询到发生,table1.php包括查询对象和销售人员API插件,在登录到Salesforce每个重载和查询。

登录返回一个会话标识,该标识将被放入会话并重复使用,直至到期。

现在有30个用户,5个表格,每个表格有30列,每个用户显示信息以便共享。

2张桌子每隔30分钟刷新一次,每分钟刷新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 

我不确定这是否甚至可能,所以我将不胜感激任何建议。

这是光油的conf,

sub vcl_recv { 

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

} 

我只是基本上是试图缓存所有的cookies,以保持 'PHPSESSID'。我也尝试缓存POST和GET以防万一,但这并没有真正做到这一点。

if (!(req.method ~ "GET") && !(req.method ~ "POST")) { 
    return (pass); 
} 

如何得到清漆这种方案或工作如何减少与其他方法查询任何想法?

干杯。

+0

从源头解决问题。缓存来自Salesforce的响应。例如使用redis或memcache。请阅读https://stackoverflow.com/questions/4273734/how-to-make-varnish-ignore-not-delete-cookies如果你想进行清漆,但它可能会有相当不好的后果。 –

+0

无法访问后端,并且salesforce管理员不会这样做,所以需要找到中间或前端解决方案 – eLGusto

+0

然后,您运气不佳。如果您需要保持PHPSESSID,以便用户之间不共享响应,则不需要缓存任何内容。即使您缓存每个用户的响应,但由于您要返回陈旧的数据,因此它将首先刷新表的目的失败。您可以通过减少JavaScript中的刷新率来实现同样的效果。 –

回答

-1

在评论的人是正确的,你不应该使用清漆,但如果你没有任何选择去为它。我也用它作为组织问题的解决方法。

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

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

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

祝你好运。