На сайте с ~5000 страниц возникли проблемы с перепутыванием контента страниц. Например, при загрузке страницы site.com/a.html контент был со страницы b.html. Все это решается путем очистки кеша, но это не очень хорошее решение. Так как постоянно обновлять кеш сильно накладно, сайт долго грузится.
Порылся в zcache.php, нашел интересную строчку №102:
$filename = $dir . '/' . $prefix . md5(time());
$filename - это имя временного файла куда пишется кеш страницы. Из этого следует, что существует теоретическая возможность старта кеширования двух страниц в одно и то же время (time() будет одинаковым) и контент одной страницы перекроет другой, что как я понимаю и случается.
Как вариант можно поменять код на $filename = $dir . '/' . $prefix . time() . mt_rand();
Хотелось бы услышать комментарий разработчиков по этому поводу.
0
Проблемы с кешем
Автор
blood
, 04.03.2009, 10:14
Сообщений в теме: 4
#1
Отправлено 04.03.2009, 10:14
#2
Отправлено 05.03.2009, 10:23
Здравствуйте, blood,
Теоретически это возможно, если между записью этого временного файла и его переименованием будет произведена вторая запись. Спасибо, что указали на эту строчку. Мы постараемся в ближайшее время выложить обновление, где она будет заменена на следующую конструкцию:
Теоретически это возможно, если между записью этого временного файла и его переименованием будет произведена вторая запись. Спасибо, что указали на эту строчку. Мы постараемся в ближайшее время выложить обновление, где она будет заменена на следующую конструкцию:
do { $filename = $dir . '/' . $prefix . mt_rand(); } while (file_exists($filename));
#3
Отправлено 07.03.2009, 14:51
а можно просто использоваться microtime() вместо time(). С точностью до микросекунды время выполнения совпасть не может.
#4
Отправлено 10.03.2009, 08:42
Alek$ (7.3.2009, 16:51) писал:
а можно просто использоваться microtime() вместо time(). С точностью до микросекунды время выполнения совпасть не может.
Все таки вариант с проверкой на существование файла мне нравится больше)
#5
Отправлено 10.03.2009, 10:47
тут дело не в быстроте. Вероятность, что в двух параллельных запросах один и тот же фрагмент будет выполняться в одну и ту же миллисекунду практически не отличается от нуля. В однопроцессорных системах она вообще нулевая.
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 скрытых пользователей