0

我们在我们的网站上使用 zend 页面缓存来提高性能。我们使用 memcached 作为缓存后端。

问题:缓存有效,即您第一次加载页面并将其存储在缓存中。您重新加载页面并从缓存中检索它,这可以正常工作一段时间。不知何故,主页缓存随机变为空(到目前为止似乎只影响主页)。据我所知,实际主页不可能没有提供任何内容(除非可以缓存 HEAD 请求)。所以我不确定它是如何覆盖缓存的。缓存ID相同,但缓存内容为0字节。有谁之前经历过这个吗?

在我们切换到负载平衡设置之前,我们从来没有遇到过这个问题——我们在 2 个 Web 服务器前面有 2 个负载平衡,它在它们之间进行负载平衡,在一个服务器上使用 memcached。关闭辅助网络服务器没有任何区别,它仍然一团糟。

4

1 回答 1

0

终于想通了 经历了很多很多方法来让这个工作..终于!

Cliffs:Zend Page Cache 会将 HEAD 请求缓存到与用户 GET 请求具有相同缓存 id 的页面。问题是,HEAD请求总是会有一个空的响应体。

我在 Bootstrap.php 之后添加了一些调试代码,$cache->start()以记录有关正在访问的页面、协议、主机、响应代码、用户代理和 IP 的一些详细信息。

$start = $cache->start();
$start = $start === false ? 'false' : 'true';
$uri = $this->ns->https ? 'https://' : 'http://';
$uri = $uri . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$debug = date('Y-m-d H:i:s', time()) . "\t".$_SERVER['REMOTE_ADDR']."\t".$_SERVER['REQUEST_METHOD']."\tCache: $start\tUri: $uri";
$debug .= "\t " . http_response_code() . "\t";
$debug .= "\t " . $_SERVER['HTTP_USER_AGENT'];
file_put_contents(APPLICATION_PATH.'/logs/cachestartresult.log', $debug."\n", FILE_APPEND);

我将它添加到inZend_Cache_Frontend_Page之前以表明它已缓存,但没有数据。die()start()

$uri = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$debug = date('Y-m-d H:i:s', time()) . "\t".$_SERVER['REMOTE_ADDR']."\t".$_SERVER['REQUEST_METHOD']."\tCache: true (dieing".(empty($data) ? " - data is but cache exists":"").")\tUri: $uri";
$debug .= "\t " . http_response_code() . "\t";
file_put_contents(APPLICATION_PATH.'/logs/cachestartresult.log', $debug."\n", FILE_APPEND);

ob_start()start()函数中添加了这个:

$uri = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$debug = date('Y-m-d H:i:s', time()) . "\t".$_SERVER['REMOTE_ADDR']."\t".$_SERVER['REQUEST_METHOD']."\tCache: new cache\tUri: $uri";
$debug .= "\t " . http_response_code() . "\t";
file_put_contents(APPLICATION_PATH.'/logs/cachestartresult.log', $debug."\n", FILE_APPEND);

所以基本上我发现输出是:我加载了一个页面,它缓存得很好。如果我清除了缓存,并且在再次缓存之前执行了 HEAD 请求(例如,通过 Newrelic 或 pingdom 等),它会将页面缓存为空,并且在我清除缓存之前不会再次工作。

现在我唯一关心的是缓存是如何自动清空的。但是耶!我只通过启动缓存来阻止它$_SERVER['REQUEST_METHOD'] != "Head"

于 2013-05-25T10:14:43.460 回答