Отключение кэширования сокрушит вашу веб-камеру (даже хорошую), если она станет популярной
Я пытался разрешить кэширование изображения в течение 6 секунд (Cache-Control: max-age = 6), потому что мне нужно было предотвратить перегрузку веб-камеры. Код, с которым я работал, выглядел примерно так, но у него есть проблема:
<img alt="Webcam image of something popular" id="liveimage" src="http://example.com/webcams/suddenlypopular.jpg" /><br />
<script type="text/javascript">
(function() {
setInterval(function() {
var myImageElement = document.getElementById('liveimage');
myImageElement.src = 'http://example.com/webcams/suddenlypopular.jpg';
}, 6000);
}());
</script>
Ранее веб-разработчик включил? Rand = (случайное число) в качестве метода очистки кэша. Это плохо, когда изображение кэшируется (даже если только в течение короткого периода времени), потому что если означает, что вы можете (в зависимости от того, будет ли ваш кэш рассматривать параметры запроса как не кэшируемые), это означает, что вы получаете очень низкую частоту обращений в кэш и вы получаете множество представлений страниц.
Проблема заключалась в том, что изображение теперь не обновлялось, поскольку, хотя атрибут src переназначался, он фактически не менялся на другое значение, поэтому браузер (Chrome 51) не обновлял изображение. Я изменил логику, чтобы иметь либо ?1
, либо ?2
аргумент строки запроса, и чередовать их.
<img alt="Webcam image of something popular" id="liveimage" src="http://example.com/webcams/suddenlypopular.jpg?1" /><br />
<script type="text/javascript">
(function() {
setInterval(function() {
var myImageElement = document.getElementById('liveimage');
if (myImageElement.src == 'http://example.com/webcams/suddenlypopular.jpg?1') {
myImageElement.src = 'http://example.com/webcams/suddenlypopular.jpg?2';
} else {
myImageElement.src = 'http://example.com/webcams/suddenlypopular.jpg?1';
}
myLogElement.innerHTML = myImageElement.src;
}, 6000);
}());
</script>
РЕДАКТИРОВАТЬ : хотя это работает в Chrome и IE, оно не работает в Firefox, поэтому я нашел альтернативное решение, которое работает в Chrome, Firefox и IE (Safari в настоящее время не тестируется) .
<img alt="Webcam image of something popular" id="liveimage" src="http://example.com/webcams/suddenlypopular.jpg" />
<script type="text/javascript">
(function() {
setInterval(function() {
var myImageElement = document.getElementById('liveimage');
var d = new Date();
// 6000 is 6 seconds; the desired refresh rate
// % n is a bit of an experiment for being nice on cache invalidation; it also puts a bound on how out-of-date something would be regarding clock skew.
var timeSlice = Math.floor(d.getTime() / 6000) % 3;
myImageElement.src = 'http://example.com/webcams/suddenlypopular.jpg?t=' + timeSlice;
}, 6000);
}());
</script>
Так что теперь у меня есть веб-камера с поддержкой кэша, которая обновляет данные.
Конфигурация обратного прокси Apache
Вот фрагмент из Apache httpd о том, как вы можете использовать обратный прокси-сервер для настройки конкретной политики кэширования.
<Location /webcams/suddenlypopular.jpg>
ProxyPass http://mywebcamdevice.example.com/snapshot.jpg
ProxyPassReverse http://mywebcamdevice.example.com/snapshot.jpg
ExpiresByType image/jpeg "access plus 6 seconds"
Header unset ETag
Header unset Last-Modified
</Location>