Перейти к содержимому


- - - - -

Проблемы с кешем


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 4

#1 blood

blood

    Новичок

  • Пользователи
  • Pip
  • 2 сообщений

Отправлено 04.03.2009, 10:14

На сайте с ~5000 страниц возникли проблемы с перепутыванием контента страниц. Например, при загрузке страницы site.com/a.html контент был со страницы b.html. Все это решается путем очистки кеша, но это не очень хорошее решение. Так как постоянно обновлять кеш сильно накладно, сайт долго грузится.
Порылся в zcache.php, нашел интересную строчку №102:
$filename = $dir . '/' . $prefix . md5(time());
$filename - это имя временного файла куда пишется кеш страницы. Из этого следует, что существует теоретическая возможность старта кеширования двух страниц в одно и то же время (time() будет одинаковым) и контент одной страницы перекроет другой, что как я понимаю и случается.
Как вариант можно поменять код на $filename = $dir . '/' . $prefix . time() . mt_rand();
Хотелось бы услышать комментарий разработчиков по этому поводу.

#2 support

support

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 1 140 сообщений

Отправлено 05.03.2009, 10:23

Здравствуйте, blood,

Теоретически это возможно, если между записью этого временного файла и его переименованием будет произведена вторая запись. Спасибо, что указали на эту строчку. Мы постараемся в ближайшее время выложить обновление, где она будет заменена на следующую конструкцию:

do {
	$filename = $dir . '/' . $prefix . mt_rand();
} while (file_exists($filename));


#3 Alek$

Alek$

    Активный участник

  • Тестеры
  • PipPipPip
  • 183 сообщений
  • Город: Новосибирск, Россия
  • WEB-программирование, seo, музыка (гитара)

Отправлено 07.03.2009, 14:51

а можно просто использоваться microtime() вместо time(). С точностью до микросекунды время выполнения совпасть не может.

#4 blood

blood

    Новичок

  • Пользователи
  • Pip
  • 2 сообщений

Отправлено 10.03.2009, 08:42

Просмотр сообщенияAlek$ (7.3.2009, 16:51) писал:

а можно просто использоваться microtime() вместо time(). С точностью до микросекунды время выполнения совпасть не может.
А вдруг будет мегабыстрый сервер, на котором совпадет и microtime()   :)
Все таки вариант с проверкой на существование файла мне нравится больше)

#5 Alek$

Alek$

    Активный участник

  • Тестеры
  • PipPipPip
  • 183 сообщений
  • Город: Новосибирск, Россия
  • WEB-программирование, seo, музыка (гитара)

Отправлено 10.03.2009, 10:47

тут дело не в быстроте. Вероятность, что в двух параллельных запросах один и тот же фрагмент будет выполняться в одну и ту же миллисекунду практически не отличается от нуля. В однопроцессорных системах она вообще нулевая.




Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 скрытых пользователей