Загрузка IMG не из кэша

Вопросы по программированию
Сообщение
Автор
Аватара пользователя
Big_Dog
Аксакал
Сообщения: 3732
Зарегистрирован: 28 ноя 2008 04:23 am
Репутация: 80
Откуда: Щекино

Загрузка IMG не из кэша

#1 Сообщение Big_Dog » 31 янв 2011 20:08 pm

Знатоки-кодеры, вопрос такой...
Есть сайт с картинками JPG, загружаемыми строкой вида:

Код: Выделить всё

<img src="path/foto01.jpg">
Картинка является анонсом и периодически обновляется. То есть имя и путь к ней остается прежний, а сам файл JPG заменяется. Однако браузер после перезаливки картинки по FTP не хочет перегружать ее с сервера, а берет старую из кэша. После принудительных тычков "обновить страницу" кэш браузера все-таки обновляется. Но это не есть гуд. Так как не все пользователи об этом знают.
Вопрос: как заставить браузер обновить кэш только этой картинки? При этом кэш других картинок страницы обновлять не нужно.
Не торопись отвечать. Сначала подумай: а оно тебе надо? :wink:

Аватара пользователя
Сергей В.
Аксакал
Сообщения: 2282
Зарегистрирован: 23 окт 2009 23:50 pm
Репутация: 26
Откуда: Прекрасное далёко.

#2 Сообщение Сергей В. » 31 янв 2011 20:57 pm

Тонкостей не знаю, но как вариант (но запарный) сделать страницу динамичной.. как вариант чтоб эту картинку открывал java скрип, также можно флэш..

P.S: Сорри, чт о в общих чертах, языков углублённо не знаю..

Аватара пользователя
Сергей В.
Аксакал
Сообщения: 2282
Зарегистрирован: 23 окт 2009 23:50 pm
Репутация: 26
Откуда: Прекрасное далёко.

#3 Сообщение Сергей В. » 31 янв 2011 21:24 pm

Мысль осенила!

Можно ещё так на php

Код: Выделить всё

echo "путь к файлу";
В синтаксисе могу ошибаться, но по идее картинка должна каждый раз грузиться с ервера (если конечно есть поддержка php)

Аватара пользователя
Mamucho666
Старейшина
Сообщения: 6655
Зарегистрирован: 23 окт 2007 22:30 pm
Репутация: 41
Откуда: Дрожащие острова.

#4 Сообщение Mamucho666 » 31 янв 2011 21:49 pm

Сам вывод анонса на страницу <img src="/anons.php">

anons.php :
<?php
header('Content-type: image/png');
header('Expires: Mon, 01 Jul 1990 00:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');
тут должна быть строчка, которая будет выводить твоё изображение через php. Я поищу, может что найду. На уме пока только та, которая превьюшки делает (=размер меняет), можно поставить незначительное изменение размера, но это лишняя нагрузка на сайт, короче я посмотрю, но идея должна быть примерно такой как мне кажется.
?>

P.S. Сергей В. Ты в курсе что клиент не знает о том, что происходит на сервере? Я хочу сказать что для него нету разницы на чём написана страничка на сервере, в html или в php, потому что php это препроцессор html, то есть гипертекста, то есть гипертекстовый препроцессор. Ради интереса посмотри исходник этого сайта и найди хоть один синтаксис php, если сайт не кривит, то ты не найдёшь. Или ты думаешь что админ все страницы в ручную лепил?
Hallelujah!

Аватара пользователя
serg-smirnoff
Капитан Корабля
Сообщения: 8623
Зарегистрирован: 07 май 2005 21:17 pm
Репутация: 302

#5 Сообщение serg-smirnoff » 31 янв 2011 22:00 pm

Big_Dоg, вообще, если конечно мне не изменяет память, то кеширование распространяется не на какое-то определенное изображение, а на всю страницу целиком. Соответственно самый прямой способ управлять кешированием страницы это то, что уже написал Вадим, через заголовки. Подробнее про них можно почитать тут http://www.codenet.ru/webmast/php/caching.php

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

Интуиция мне подсказывает что надо это делать через что-то стороннее вроде memcached php, потому как эта штука поддерживает кеширование партиалов, то есть частей, то есть можно задать партиал который кешировать или в обратную не кешировать, и будет тебе счастье.

Но что бы разобраться как оно работает, необходимо будет интерпритатор php с поддержкой memcached пересобрать, потому что хостеры из коробки не собирают интерпритатор php с поддержкой memcached.

И да, может быть и иное более простое решение. Например забить и не париться. И кстати, если это wordpress (если о нем речь идет), то там есть плагины всякие вкусные для работы с кешем.
Государство, приказывающее умирать детворе, всегда назовет себя родиной

Аватара пользователя
serg-smirnoff
Капитан Корабля
Сообщения: 8623
Зарегистрирован: 07 май 2005 21:17 pm
Репутация: 302

#6 Сообщение serg-smirnoff » 31 янв 2011 22:02 pm

Сергей В. писал(а):Мысль осенила!
Можно ещё так на php

Код: Выделить всё

echo "путь к файлу";
Мысль конечно гениальная, но кусок кода echo "путь к файлу" выведет в поток (в случае с вебней в браузер) просто надпись "путь к файлу". Или ты полагаешь что произойдет что-то иное?
Государство, приказывающее умирать детворе, всегда назовет себя родиной

Аватара пользователя
Serg2006
Аксакал
Сообщения: 2159
Зарегистрирован: 08 мар 2006 18:27 pm
Репутация: 31

#7 Сообщение Serg2006 » 31 янв 2011 22:09 pm

Сергей В. писал(а):Мысль осенила!

Можно ещё так на php

Код: Выделить всё

echo "путь к файлу";
В синтаксисе могу ошибаться, но по идее картинка должна каждый раз грузиться с ервера (если конечно есть поддержка php)
Ну раз мысль осенила, то ее надо развивать :) в таком виде от нее толку не будет, php отработает на сервере и отдаст браузеру html код в котором имя файла будет всегда одинаковым, даже при изменении самого файла (см. условия задачи :D ) соответственно картинка попадет в кэш )))
Тут или плясать с бубном чтоб ссылка на файл для браузера всегда была разной например как-то так

Код: Выделить всё

echo"
$rand=rand(0,1000); 
<img src=\"site.ru/file.jpg?ran=$rand\" >";
или прописывать мета тег <meta http-equiv="Cache-Control" content="[no-cache], [public], [private], [no-store], [no-transform], [must-revalidate], [proxy-revalidate], [max-age=n]"> для всей страницы
как вариант можно в .htaccess прописать отдачу HTTP-заголовков Expires для определенного типа данных

Код: Выделить всё

<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/gif "access plus 1 day"
ExpiresByType image/jpeg "access plus 1 day"
ExpiresByType image/png "access plus 1 day"
</IfModule>
В апаче должен быть доступен модуль mod_expires
Если в апаче есть модуль mod_headers можно вместо мета тега http-equiv="Cache-Control" забить конкретно отдачу http заголовков управляющих кешем для картинок

Код: Выделить всё

<IfModule mod_headers.c>
<FilesMatch .*\.(gif|jpg|png)$>
Header set Cache-control: no-cache
</FilesMatch>
</IfModule>
В теории как-то так, но это явно не для одной картинки.
Нет такой чистой и светлой мысли, которую русский человек не смог бы выразить в грязной матерной форме.

Аватара пользователя
Mamucho666
Старейшина
Сообщения: 6655
Зарегистрирован: 23 окт 2007 22:30 pm
Репутация: 41
Откуда: Дрожащие острова.

#8 Сообщение Mamucho666 » 31 янв 2011 22:14 pm

Вот собственно думаю примерно так должно быть.

Это на главной выводится изображение анонса:
<img src="/anons.php">

Это собственно сам anons.php

<?php
//Запрещает кэшировать:
header('Content-type: image/jpg');
header('Expires: Mon, 01 Jul 1990 00:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');
//Создаётся индификатор изображения:
$anons = imagecreatefromjpeg ("anons.jpg");
//Выводится на экран:
imagejpg ($anons);
//Освобождаем от него память:
imagedestroy($anons);
?>

Только наверняка я где-то накосячил, ибо уже давно не был рядом с этим.
Hallelujah!

Аватара пользователя
Сергей В.
Аксакал
Сообщения: 2282
Зарегистрирован: 23 окт 2009 23:50 pm
Репутация: 26
Откуда: Прекрасное далёко.

#9 Сообщение Сергей В. » 31 янв 2011 22:30 pm

Mamucho666 писал(а):P.S. Сергей В. Ты в курсе что клиент не знает о том, что происходит на сервере? Я хочу сказать что для него нету разницы на чём написана страничка на сервере, в html или в php, потому что php это препроцессор html, то есть гипертекста, то есть гипертекстовый препроцессор. Ради интереса посмотри исходник этого сайта и найди хоть один синтаксис php, если сайт не кривит, то ты не найдёшь. Или ты думаешь что админ все страницы в ручную лепил?
В курсе
serg-smirnoff писал(а):Сергей В. писал(а):Мысль осенила! Можно ещё так на phpКод:echo "путь к файлу";Мысль конечно гениальная, но кусок кода echo "путь к файлу" выведет в поток (в случае с вебней в браузер) просто надпись "путь к файлу". Или ты полагаешь что произойдет что-то иное?
Блин, точняк :)

Serg2006

Вот истинный гений! :) Надо было объявить переменную и присвоить ей значение пути к файлу.. а вот пляски с кэшем, про это я не знал вообще..

Аватара пользователя
Mamucho666
Старейшина
Сообщения: 6655
Зарегистрирован: 23 окт 2007 22:30 pm
Репутация: 41
Откуда: Дрожащие острова.

#10 Сообщение Mamucho666 » 31 янв 2011 22:44 pm

Есть крутая идея!

Ты заливаешь изображение.

1 зашедший пользователь запускает php код (самопроизвольно естественно, то есть без кнопок), который
А - Записывает время создания только что залитого тобой файла в базу данных или в текстовый файл
Б - создаёт из залитого тобой изображения новое с новым именем, которое создано рандомно (найди готовый код в интернете для создания рандомных строк с блэклистом)
В - Меняет ссылку на новое изображение


2 и последущие пользователи будут только запускать проверку изменилось ли время создания, и если оно изменилос выполнять эти пункты:
А - Записывает время создания только что залитого тобой файла в базу данных или в текстовый файл
Б - создаёт из залитого тобой изображения новое с новым именем, которое создано рандомно (найди готовый код в интернете для создания рандомных строк с блэклистом)
В - Меняет ссылку на новое изображение
Г - Удаляет созданное php изображение в прошлый раз.
Hallelujah!

Аватара пользователя
Big_Dog
Аксакал
Сообщения: 3732
Зарегистрирован: 28 ноя 2008 04:23 am
Репутация: 80
Откуда: Щекино

#11 Сообщение Big_Dog » 31 янв 2011 22:57 pm

Находил решение через JS:

Код: Выделить всё

<img id="myimage" src="anons.jpg">
<script type="text/javascript">
getimage(function() {document.getElementById('myimage').src = 'anons.jpg?' + Math.random();}
</script>
Нифига не получилось.
Не торопись отвечать. Сначала подумай: а оно тебе надо? :wink:

Аватара пользователя
Big_Dog
Аксакал
Сообщения: 3732
Зарегистрирован: 28 ноя 2008 04:23 am
Репутация: 80
Откуда: Щекино

#12 Сообщение Big_Dog » 31 янв 2011 23:18 pm

Serg2006 писал(а):как вариант можно в .htaccess прописать отдачу HTTP-заголовков Expires для определенного типа данных
Нет, это не подходит. У мну куча других JPEG картинок, которые желательно было бы кэшировать, и всего 3-4, которые меняются раз в неделю.
Serg2006 писал(а):$rand=rand(0,1000);
<img src=\"site.ru/file.jpg?ran=$rand\" >";
Ща попробую поиграть с таким кодом без JS
Не торопись отвечать. Сначала подумай: а оно тебе надо? :wink:

Аватара пользователя
Big_Dog
Аксакал
Сообщения: 3732
Зарегистрирован: 28 ноя 2008 04:23 am
Репутация: 80
Откуда: Щекино

#13 Сообщение Big_Dog » 01 фев 2011 01:41 am

Есть, ура! Получилось :o :)
Как говорится, действительно, всё гениальное просто.

Кому интересно поделюсь опытом:

Делал, как предложил Serg2006:

Код: Выделить всё

<?php $slideimage = rand(1, 1000); ?>
.....
<img src="http://mydomen/path/01.jpg?=<?php echo $slideimage; ?>>
Но на самом деле, случайное число в конце URL картинки совсем необязательно.
Как написано в пункте 3 статьи, предложенной serg-smirnoff (http://www.codenet.ru/webmast/php/caching.php):
Страницы запрашиваемые по GET и содержащие параметры (в URL присутствует '?') не сохраняются в кэш, если не указано обратное.
То есть вполне достаточно к URLу в конец дописать любую байду, какая понравится :D , но начинающуюся с "?" например в моем случае можно так:

Код: Выделить всё

<img src="http://mydomen/path/01.jpg?=big-dog">
Такая картинка в кэше не сохраняется.

ЗЫ: Пробовал и так и так - все работает. Оставил с рандомом. Так, на всякий случай :D .
Не торопись отвечать. Сначала подумай: а оно тебе надо? :wink:

Аватара пользователя
Big_Dog
Аксакал
Сообщения: 3732
Зарегистрирован: 28 ноя 2008 04:23 am
Репутация: 80
Откуда: Щекино

#14 Сообщение Big_Dog » 01 фев 2011 01:42 am

Всем, кто помогал. Огромное СПАСИБО. :wink:
Не торопись отвечать. Сначала подумай: а оно тебе надо? :wink:

Аватара пользователя
Mamucho666
Старейшина
Сообщения: 6655
Зарегистрирован: 23 окт 2007 22:30 pm
Репутация: 41
Откуда: Дрожащие острова.

#15 Сообщение Mamucho666 » 01 фев 2011 08:29 am

Оказывается всё просто было.
Hallelujah!

Ответить