2009-10-12 4 views
4

Я разрабатываю сайт PHP, который обслуживает статический контент из свободного домена cookie (Спасибо, блог!), Этот домен обслуживает контент с высоким кешем, который, среди прочего, означает, что я не могу изменить содержимое (JS, CSS и изображения) без аннулирования этого кеша. В настоящее время я делаю это путем добавления версии (например, style.css? 19) до конца статического URL-адреса, в настоящее время я делаю это вручную, что явно далеко не удобно.Автоматическое обновление статического содержимого

Каким будет рекомендованный способ завершить это? Я использую Subversion, и из моего понимания существуют различные инструменты, которые я могу использовать, чтобы захватить номер версии, но как я могу это сделать в PHP (для каждой загрузки этой страницы не очень удобно работать?). Я предполагаю, что я, скорее всего, буду использовать какую-то систему сборки.

Любые рекомендации были бы весьма полезными.

Благодаря

ответ

3

SVN keyword substitution может быть решением. Вы бы использовали его следующим образом: сначала добавьте следующий код в свой код PHP, где-то рядом с местом, где вы хотите использовать эту версию. Например:

$svn_version = '$Revision$'; // remember to use single quotes! 

Теперь зафиксируйте этот файл. И затем снова откройте его. Заметим, что выше линии теперь изменилось, чтобы выглядеть примерно так:

$svn_version = '$Revision: 66232 $'; 

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

Теперь вам просто нужно немного манипулировать струнами, чтобы получить это число из этой строки. Я уверен, вы можете понять это сами.

Конечно, это не работает, когда вы обновляете фактические файлы css/js, не касаясь PHP. И это нелегко решить. Вы можете менять PHP каждый раз, когда вы меняете CSS/JS. Или да, вы можете пойти на какую-то систему сборки.

В любом случае, я надеюсь, что у вас есть идеи из этого.

+0

Спасибо за идею Anti, но, как вы сказали, файл PHP также должен быть обновлен, что часто бывает не так (есть 10 файлов, ссылающихся на статический контент); Я также могу отредактировать номер вручную. –

+0

, но тогда, как добавить текущую временную метку в конец статического URL? это будет эффективно обходить кеш. –

+1

Текущая временная метка? Но тогда кеш был бы недействителен для каждой загрузки страницы, я только хочу, чтобы он изменился, когда статический материал действительно изменился. –

1

Идея состоит в том, чтобы иметь текстовый файл, который содержит только число (то есть номер ревизии). При каждом обновлении вы увеличиваете это число (как идентификатор версии SVN или просто счетчик, как хотите).

Итак, вы должны действовать, как вы предлагали; вы читаете номер в файле и передаете его как аргумент GET вашим CSS или другим файлам. Один из реализованных, вам просто нужно обновить номер версии (и, возможно, очистить кеш, если вы ее используете) для обновления на каждой странице. Довольно легко :)

2

Существует отличный PHP script и набор .htaccess, который может использоваться для управления версиями файлов CSS/Javascript. Он работает, переписывая все запросы CSS/JS в файл comb.php, который затем проверяет, был ли файл изменен. Если он есть, он создает новую кешированную версию файла. Если он не был изменен, он может просто отправить ранее кэшированную версию файла. Этот скрипт также имеет преимущество минимизации количества HTTP-запросов, что является еще одним улучшением производительности.

Изображения сложнее - на базовом уровне вы можете искать/заменять через свои файлы css для имен изображений и обновлять их. Это может быть включено в скрипт сборки. SASS - это система обработки css, которая поддерживает переменные в CSS, что означает, что вам нужно будет обновлять имена изображений только в одном месте.

Наконец, я заметил, что при использовании инструмента, такого как Fiddler, если строка запроса включена в запрос, браузер может игнорировать заголовки истечения срока действия и обращаться к серверу в любом случае, поэтому лучше разместить его в подкаталоге, т. е. вместо

/css/main.css?16 

/css/16/main.css 
Смежные вопросы