2012-06-22 2 views
1

Вот что. Я подаю несколько сжатых содержимое CSSphp заголовки для обслуживания css по php

(`str_replace(array("\r", "\n", "\t", '\s\s+'), '', cssGoesHere)`) 

через PHP файл в моей странице:

<link rel="stylesheet" type="text/css" href="/css/loader.css.php" />

Вопрос: как я могу сделать кэш браузера CSS-возвращенным, НО обновления кеш, если содержимое изменено?

Файл PHP не модифицируются, поэтому добавляя что-то вроде

<?php echo filemtime('/css/loader.css.php'); ?> 

атрибуту href это не вариант. Можно ли это решить с помощью заголовков, и если да, то как? Поскольку AFAIK, если я его обслуживаю, как я писал выше, браузер будет просто кэшировать результат и повторно использовать кеш (если, конечно, браузер включен/способен), но мне нужно, чтобы он знал, когда содержимое изменилось.

Редактировать: Я создал проект github с моим кодом (хотя я и изменил его для большей гибкости, так как написал это). Вот ссылка: https://github.com/jurchiks/YACC
Если у вас есть предложения, напишите их на мой e-mail или smth.

ответ

1

Это может быть решено с помощью кеш-контроля заголовков, но это оказалось не очень эффективным. Поскольку некоторые браузеры переписывают или изменяют ваши принудительные настройки.

Я не могу видеть, откуда вы получаете данные CSS, если это файл CSS, вы можете получить filemtime файла css в качестве индикатора версии или просто указать где-нибудь строку версии, которая должна быть изменена каждый раз, когда CSS изменения файла.

Кстати, str_replace(array("\r", "\n", "\t", '\s\s+'), не удаляет все строки новой строки. Вы должны использовать что-то вроде

$foo = nl2br($string, FALSE); 
$bar = str_replace(array('<br>', '\s\s+'), '', cssGoesHere) 

вместо этого.

НТН :)

+1

Спасибо за идею о новых символах, я использую его в своем коде :) Я также поместил его в github, чтобы заинтересованные люди могли его прочитать и, возможно, использовать. – jurchiks

1

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

Лучшей альтернативой, если вы действительно не можете добавить измененную дату в HTML, было бы установить заголовки кеша через PHP.

header("Cache-Control: max-age=time-in-seconds"); 

Это не всегда работает, хотя, как настройки сервера и настройки браузера можно переопределить, особенно в агрессивных кэширования браузеров, таких как Internet Explorer.

0

я хотел бы предложить, чтобы где-то время, что содержимое кэша был создан, например, style.php который содержит данные CSS Последнее изменение в 21/06/2012 и кэш-контента был последний созданный в 20/06/В 2012 году, проведя сравнение по датам в целых числах strtotime(), вы увидите, что кешированный контент должен быть снова создан из нового содержимого.

+0

style.php не является сгенерированным файлом, это файл generatOR. На самом деле он не содержит CSS, поэтому невозможно указать время модификации из этого файла, вам нужно будет проверить фактические файлы CSS, но это не идея. – jurchiks

1

использовать это в вашей странице PHP CSS:

header('Content-type: text/css'); 
header("Cache-Control: no-cache, must-revalidate"); 

вы можете увидеть больше information about headers in PHP's official documentation

+0

Это не отвечает на вопрос - речь идет о контроле, когда браузер повторно загружает страницу, а не о том, чтобы интерпретировать ее как CSS. – Death

+0

Первая строка кода - это итерация php как файла css. –

+0

Когда я опубликовал этот комментарий, вы не указали вторую строку, только указали заголовок 'Content-type'. Вопрос не в том, чтобы интерпретировать PHP как CSS, и поэтому ваш ответ отвечал на что-то не заданное. Теперь вы изменили его, так что все хорошо. – Death

1

Вы можете добавить номер версии в HREF CSS ссылки и использовать мод рерайт маршрутизировать его обратно к оригиналу Файл CSS.

Например. Допустим, вы начинаете с версии 1 (обратите внимание на версию приложение к имени файла):

<link rel="stylesheet" type="text/css" href="/css/loader-v001.css.php" /> 

Браузер будет кэшировать этот файл. В следующий раз, когда вы обновите файл CSS, и вы не хотите, чтобы браузер использовать кэш-файл, просто изменить номер версии, как это:

<link rel="stylesheet" type="text/css" href="/css/loader-v002.css.php" /> 

Тогда в вашем модом переписывание, маршрут любой запрос для файла loader-v{x}.css.php - loader.css.php.

Я не уверен, что это «автоматизировано» для ваших нужд, так как оно требует ручной смены номера версии. Однако другое имя файла гарантирует, что браузер увидит его как настоящий «новый» файл и перезагрузит его.

+0

Но для этого абсолютно требуется mod_rewrite или его эквивалент, и, следовательно, это не хороший вариант. Хотя это неплохая идея. – jurchiks

+0

О, конечно. Это, конечно, не общее решение, но его стоит выбросить на рассмотрение. – Jen

Смежные вопросы