Кэширование намертво

Wicked

Новичок
Кэширование намертво

Народ, меня заинтересовал такой момент...

Хочется сделать, чтобы статические js, css, картинки, и прочая статика кэшировались браузером намертво (чтобы даже не было http-запроса с проверкой, который обычно заканчивается 304 NOT MODIFIED, ибо это так и так round trip'ы), а инвалидация такого кэша производилась бы исключительно сменой урла. Урлы в данном случае могли бы быть как на небезызвестном сайте вконтакте: а-ля https://vkontakte.ru/js/activity.js?10 или https://vkontakte.ru/js/effects.js?6. Как требование к реализации можно обозначить отсутствие человеческого фактора. В то же время желательна минимизация затрат на вычисление, т.е., скорее всего, понадобится кэширование.

Т.к. сам деплоймент происходит используя apache ant, то вмешательство человека для очистки кэша не нужно.

Пока что мне это видится так:
в качестве версий файлов вполне можно использовать filemtime (кроме закачиваемых юзерами файлов, разве что). Чтобы не вычислять его при каждом запросе скрипта, эти данные кэшируются в shared memory или в один php-file вида:
PHP:
<?php
mycache::add(array(
"css/1.css" => 8943857984,
"css/2.css" => 3849898495,
"js/1.js" => 8734659344,
"js/2.js" => 9894898594,
"images/logo.jpg" => 9834984795,
etc...
));
?>
который затем инклюдится, и используется для формирования ссылок:
PHP:
print "<a href=\"css/1.css?".mycache::get("css/1.css")."\">";
С картинками, которые у нас закачивают юзеры как то мне все видится прозрачней за счет добавления версионности к записям в бд: например, поменял пользователь свой аватар => версия аватара в базе изменилась => в html выводится урл до аватары не /avatars/78347.jpg?9, а /avatars/78347.jpg?10.

Собственно, интересуют альтернативные решения: побольше и разных.
 

MiRacLe

просто Чудо
чтобы исключить "человеческий фактор", лучше на мой взгляд вот так:

PHP:
print '<a href="'.mycache::get('css/1.css').'">';

И ещё - для многих файлов вместо filemtime можно номер ревизии из SCM брать.
 

Wicked

Новичок
Автор оригинала: MiRacLe
PHP:
print '<a href="'.mycache::get('css/1.css').'">';
Да, так еще лучше :)

И ещё - для многих файлов вместо filemtime можно номер ревизии из SCM брать.
SCM - это какая-то VCS ?
Я думал насчет SVN, но кроме как через $id$ keyword мне в голову не пришло как делать. А он не подходит для картинок. Да и для файлов, выкладываемых _разработчиками_ filemtime вполне себе вариант.
 

MiRacLe

просто Чудо
SCM - Source Control Management

Номер последней ревизии можно из svn info (--xml) легко выдернуть можно
А насчёт картинок - для тех изображений, что закачиваются пользователем - есть же запись в БД. А остальные есть в SVN...

серверов, на которых лежат файлы, может быть несколько и filemtime может различаться, а ревизия вроде как общая...
 

Wicked

Новичок
Номер последней ревизии можно из svn info (--xml) легко выдернуть можно
Можно. Но это обяжет использовать svn-песочницу, доступную через http. Кроме того, что это просто лишнее требование, так еще и использовать svn-песочинцу на продакшн сервере не очень хорошо.

А насчёт картинок - для тех изображений, что закачиваются пользователем - есть же запись в БД. А остальные есть в SVN...
Про это я написал в предпоследнем абзаце. А как быть с картинками, которые деплоятся вместе с проектом?

Про несколько серверов, каюсь, не подумал. Может file_sha1() тогда? От разовой обработки пары мегабайт наверное не помрет :)
 

MiRacLe

просто Чудо
не понял про песок, песочницу и http...

а про то, что деплоиться с проектом - я полагаю, что всё что с проектом - уже в svn.

впрочем к чёрту предрассудки - монопенисуально что использовать в качестве ключа ($Rev$,filemtime,md5_file или sha1_file) - если его (кеш-файл с ключами) делать ПЕРЕД deploy (т.е. на тестовом сервере).
 

Wicked

Новичок
не понял про песок, песочницу и http...
ну считается довольно вредным и опасным, если .svn директории могут оказаться доступными через http. Подробнее, например, здеся: http://christophe.vandeplas.com/2007/11/18/side-effects-using-svn-cvs-your-website

впрочем к чёрту предрассудки - монопенисуально что использовать в качестве ключа ($Rev$,filemtime,md5_file или sha1_file) - если его (кеш-файл с ключами) делать ПЕРЕД deploy (т.е. на тестовом сервере).
Ну делание такого файла перед deploy, к сожалению, тоже не сахар. Почему-то же не компилируют темплэйты смарти или yaml-конфиги ДО деплоя, правильно? В принципе, так делать можно, но куда удобнее просто очистить кэш после заливки.
 

MiRacLe

просто Чудо
я так и не понял зачем svn должен быть доступен через http.

Кстати кто сказал что не компилируют? :)
 

Wicked

Новичок
MiRacLe
ну смотри... Высказывание
Номер последней ревизии можно из svn info (--xml) легко выдернуть можноp
подразумевает, что эта команда будет запущена в SVN-песочнице. Так? И, если я правильно уловил ход наших мыслей, мы рассуждали именно о сборе ревизий в уже задеплоеном проекте. Из этих двух утверждений следует, что задеплоенный проект - это и есть песочница SVN. Или я в чем-то не прав? :)

Кстати кто сказал что не компилируют?
ну таких людей в любом случае подавляемое меньшинство :)
 

MiRacLe

просто Чудо
ну вероятно всё же ход моих мыслей всё-таки ушёл в более рациональную сторону ;o)

в обоих вопросах ;o)

миллионы леммингов не могут ошибаться? ;o)
 

fixxxer

К.О.
Партнер клуба
>> А как быть с картинками, которые деплоятся вместе с проектом?
генерить вот этот самый

"css/1.css" => 8943857984,
"css/2.css" => 3849898495,

при выкладке на прод, циферка - номер версии в cvs/svn, не вижу тут никаких проблем. ;)
 

MiRacLe

просто Чудо
Большинство браузеров (Opera, Internet Explorer 6+, Safari) НЕ кешируют документы, если в адресе есть вопросительный знак, т.к считают их динамическими.
Вот этому утверждению следует НЕ верить.
Такое поведение действительно описано в спецификации. Но ВСЕ современные браузеры пекутся о психическом здоровье пользователя и НЕ загружают документ заново...
 
Сверху