За последние 24 часа нас посетили 16767 программистов и 1694 робота. Сейчас ищут 804 программиста ...

Lock при обновлении кеша.

Тема в разделе "Прочие вопросы по PHP", создана пользователем lem, 10 фев 2009.

  1. lem

    lem Активный пользователь

    С нами с:
    10 фев 2009
    Сообщения:
    4
    Симпатии:
    0
    Есть скрипт, который кеширует свой вывод вот так (упрощённая конструкция):
    Код (Text):
    1.  
    2. if(filemtime(CACHE_FILE) > MAX_CACHE_TIME) {
    3.      $s = render...
    4.      echo $s;
    5.      fwrite($s, CACHE_FILE);
    6. }
    7. else
    8.      readfile(CACHE_FILE);
    Проблема в том, что к этому скрипту обращаются 10-20 раз в минуту, а при обновлении кеша ему приходится работать 20-30 секунд. Для того, чтобы избежать параллельного обновления кеша нужно лочить эту операцию, я делаю это созданием .lock файла.

    Правильно ли это? Как делаете вы?
     
  2. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Обычно flock() используется. Но если кэш у вас так долго вырисовывается, то самым оптимальным будет создание параллельного файла, а потом заменой его родного, что вы и делаете.
     
  3. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Я обычно делаю так:
    PHP:
    1. <?php
    2. if ($cache_is_old && !file_exists($lock_file)) {
    3.     $f = fopen($lock_file, 'w');
    4.     flock($f, LOCK_EX);
    5.     // Regenerate cache
    6.     flock($f, LOCK_UN);
    7.     fclose($f);
    8.     unlink($lock_file);
    9. } else {
    10.     // Display cache
    11. }
     
  4. lem

    lem Активный пользователь

    С нами с:
    10 фев 2009
    Сообщения:
    4
    Симпатии:
    0
    У меня так было раньше (с flock), но на популярных запросах куча коннектов висла на 20-30 секунд - все ждали, пока кеш обновится.

    Вариант с .lock работает сейчас и всем нравится, кроме того, что скрипту приходится создавать файл в фс. Не знаю уж, на сколько это затратно, но всё же.

    На другом форуме пришёл к идее делать так:
    PHP:
    1. if(filemtime(CACHE_FILE) > MAX_CACHE_TIME) {
    2.      touch(CACHE_FILE);
    3.      ... renew...
    4. }
    Так что лучше-то?
     
  5. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    беспокоит именно время на создание файла?
    ну не убивай, а очищай в 0.
    тогда точно разницы особой не будет.
    чуть быстрее наверно будет не удаление лок-файла, а переименование его в основной. но это все равно мелочи.
     
  6. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    более интересно, как ты теггинг реализуешь.
     
  7. lem

    lem Активный пользователь

    С нами с:
    10 фев 2009
    Сообщения:
    4
    Симпатии:
    0
    Теггинг? Что это (применительно к сабжу)?
     
  8. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    пометки, кому что показывать.
    http://dklab.ru/chicken/nablas/48.html
    реализация там сомнительна - они стараются завязать всех на свои приблуды, но принцип описан.
     
  9. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    У меня не ждут, у меня отдаётся старый кеш пока генерируется новый. Потом просто записывается результат в файл кеша и всё.
     
  10. lem

    lem Активный пользователь

    С нами с:
    10 фев 2009
    Сообщения:
    4
    Симпатии:
    0
    Я работаю над механизмом кеширования форумных линеечек - каждая доступна для всех, т.ч. теги не нужны.

    DKlab'ские слоты никогда не использовал, но их теггинг выглядит хорошо, при разумном количестве тегов.
     
  11. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    закрытых форумов нет?