php - 使用 Varnish 缓存动态页面

标签 php apache caching salesforce varnish

我正在尝试在 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/

相关文章:

java - 可变大小的 LRU 缓存

php - 更新 MySQL 的问题

java - 无法通过 jMeter.bat 在 Windows 8.1 上运行 jMeter 5.0

java - 无法通过多个for循环写入excel行列(apache poi)

laravel - 如何在 phpunit 测试中使用带有模拟缓存的缓存标签?

c# - 尝试获取 ICacheManager 类型的实例时发生激活错误, key \"\"“

php - HTML 动态选择,除了 if 语句

php - 我如何使用 mysql join 来安排具有最新回复的对话

php - 检查二进制图像数据

macos - 错误 : "[ Error writing/etc/httpd/conf/httpd.conf: No such file or directory ]" while trying to edit "httpd.conf" file and save it back