Есть скрипт, который кеширует свой вывод вот так (упрощённая конструкция): Код (Text): if(filemtime(CACHE_FILE) > MAX_CACHE_TIME) { $s = render... echo $s; fwrite($s, CACHE_FILE); } else readfile(CACHE_FILE); Проблема в том, что к этому скрипту обращаются 10-20 раз в минуту, а при обновлении кеша ему приходится работать 20-30 секунд. Для того, чтобы избежать параллельного обновления кеша нужно лочить эту операцию, я делаю это созданием .lock файла. Правильно ли это? Как делаете вы?
Обычно flock() используется. Но если кэш у вас так долго вырисовывается, то самым оптимальным будет создание параллельного файла, а потом заменой его родного, что вы и делаете.
Я обычно делаю так: PHP: <?php if ($cache_is_old && !file_exists($lock_file)) { $f = fopen($lock_file, 'w'); flock($f, LOCK_EX); // Regenerate cache flock($f, LOCK_UN); fclose($f); unlink($lock_file); } else { // Display cache }
У меня так было раньше (с flock), но на популярных запросах куча коннектов висла на 20-30 секунд - все ждали, пока кеш обновится. Вариант с .lock работает сейчас и всем нравится, кроме того, что скрипту приходится создавать файл в фс. Не знаю уж, на сколько это затратно, но всё же. На другом форуме пришёл к идее делать так: PHP: if(filemtime(CACHE_FILE) > MAX_CACHE_TIME) { touch(CACHE_FILE); ... renew... } Так что лучше-то?
беспокоит именно время на создание файла? ну не убивай, а очищай в 0. тогда точно разницы особой не будет. чуть быстрее наверно будет не удаление лок-файла, а переименование его в основной. но это все равно мелочи.
пометки, кому что показывать. http://dklab.ru/chicken/nablas/48.html реализация там сомнительна - они стараются завязать всех на свои приблуды, но принцип описан.
У меня не ждут, у меня отдаётся старый кеш пока генерируется новый. Потом просто записывается результат в файл кеша и всё.
Я работаю над механизмом кеширования форумных линеечек - каждая доступна для всех, т.ч. теги не нужны. DKlab'ские слоты никогда не использовал, но их теггинг выглядит хорошо, при разумном количестве тегов.