2013-05-24 2 views
0

Мы используем кеш-страницу zend на нашем веб-сайте для повышения производительности. Мы используем memcached в качестве кеша.Кэш страницы Zend для хранения пустой строки

ПРОБЛЕМА: Кэш работает, т.е. вы загружаете страницу в первый раз и сохраняете ее в кеше. Вы перезагружаете страницу и извлекаете ее из кеша, и это работает нормально. В то же время, случайно, кеш главной страницы становится пустым (кажется, ТОЛЬКО влияет на домашнюю страницу до сих пор). Насколько возможно, фактическая домашняя страница не обслуживала контент, насколько я знаю (если только запрос HEAD не может быть кэширован). Поэтому я не уверен, как его переписать в кеш. Идентификатор кеша тот же, но содержимое кеша составляет 0 байт. Кто-нибудь испытал это раньше?

У нас никогда не было этой проблемы, пока мы не поменялись на сбалансированную нагрузку настройку - у нас есть 2 балансировки нагрузки перед 2 веб-серверами и балансировка нагрузки между ними, с memcached на одном сервере. Отключение вторичного веб-сервера не имеет значения, оно все еще запутывается.

+0

Звучит как длинный рассказ! Трудно читать .. :) –

+0

Это длинная история :(Я не совсем понимаю, как объяснить это, кроме кеша страницы, случайно создает пустой кеш и обслуживает его, так как сайт загружается абсолютно ничего и кэширует его – Benno

ответ

0

Понял, наконец,. Прошел много, много способов заставить эту работу ... наконец!

Cliffs: Zend Page Cache кэширует HEAD-запросы на страницу с тем же идентификатором кэша, что и запрос пользователя GET. Проблема в том, что запрос HEAD всегда будет иметь пустой корпус ответа.

Я добавил некоторый код отладки сразу после $cache->start() в моем Bootstrap.php, чтобы записать некоторые сведения о том, какие страницы были доступны, какой протокол, хост, код ответа, пользовательский агент и 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); 

Я добавил это Zend_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"

+0

Кэш освобождался от истечения времени истечения срока действия кеша. Мы устанавливаем его равным null, чтобы он не заканчивался. НО его все еще иногда испортили, когда паук Baidu и паук Yandex сканировали страницу> _ < – Benno

Смежные вопросы