Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Графика > реализация кэша


Автор: Bog d`An 3.9.2007, 02:37
Наверное, не совсем по теме - но все же...

функция, которая проверяет есть ли картинка на диске у пользователя и не отличается ли она от той, которая на сервере.
если совпадает - соответственно путь в теге img ставит локальный
иначе - путь к картинке на сервере. 

собственно, проблема в сравнением без загрузки - ради чего все и делается. Я думаю, сравнить по размеру файл будет достаточно... 

так вот вопрос: как сравнить размер файла на сервере и локального?

заранее спасибо

Автор: chup007 3.9.2007, 04:06
ты не можешь узнать на сервере, есть ли у клиента какой ли файл

Автор: Bog d`An 3.9.2007, 05:58
вот и предложите как можно реализовать.......

Автор: vasac 3.9.2007, 07:12
Спросить у пользователя: слюшай пользователь, есть ли у тебя картинка.

Автор: Bog d`An 3.9.2007, 09:49
 smile  Хороший вариант а еще будут? или тут не та тема.... в js обращаться?

Автор: vasac 3.9.2007, 10:33
Чего вы сделать то хотите?

Автор: Diesel Draft 3.9.2007, 11:34
Задача не просто, без JS никак

Автор: sTa1kEr 3.9.2007, 12:52
Цитата(Bog d`An @  3.9.2007,  09:49 Найти цитируемый пост)
smile  Хороший вариант а еще будут? или тут не та тема.... в js обращаться? 

Цитата(Diesel Draft @  3.9.2007,  11:34 Найти цитируемый пост)
Задача не просто, без JS никак 

JS тут тоже не поможет. Это *невозможно* реализовать на JS, т.к. в целях безопасности JS не имеет доступа к диску у клиента. Можно сделать на Java, Flash или при помощи плагинов для браузеров со всем вытекающими от сюда проблемами.

Автор: ewolf 3.9.2007, 21:28
Для таких вещей есть вполне стандартный способ кеширования - передача браузеру заголовков о том, сколько максимально можно держать файл в кэше.

Если под апач установлен mod_headers можно использовать такую команду в htaccess

Код

# Держать в кэше 1 месяц
<FilesMatch "\.(flv¦gif¦jpg¦jpeg¦png¦ico¦swf)$"> 
Header set Cache-Control "max-age=2592000" 
</FilesMatch>


в любом случае, можно все картинки выдавать через скрипт, которым подставлять нужные заголовки

Автор: Bog d`An 6.9.2007, 05:05
ewolf, к сожалению тут задача не в использовании кеша браузеров - если я правильно понял вашу идею, а в реализации его же. 
Что достигается методом подстановки в теге img параметра src как пути к файлу изображения на диске пользователя. 

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

Соответственно возможна ситуация когда файл на диске пользователя отсутствует, поврежден или не соответствует файлу на сервере(не был обновлен)... 

Как решить/замаскировать эту проблему без участия пользователя - вот в чем вопрос.

Автор: Diesel Draft 6.9.2007, 10:09
А может просто послать элементарную шапку в рисунку, где будет указывать чтоб кэшировал?

Автор: ewolf 8.9.2007, 00:43
Bog d`An, а для чего требуется такая штука? если просто для снижения нагрузки на сайт, то мой способ вполне подходит. Если, что бы просто показать, что у пользователя такой файл уже есть, то надо либо сохранять на сервере, что пользователь данный файл уже загрузил, либо просто спрашивать у пользователя. Выяснить через JS, есть ли на компьютере пользователя какой-то файл, слава Богу, нельзя.

Автор: Diesel Draft 8.9.2007, 17:37
ewolf, Зачем делать все так складно. Почему мой вариант вам не нравится. Смотрите:

Клиент -> Серверу : Дай мне информацию про объекта №3, у меня  он есть з датой 08,09,2008 17:42
Если есть изменения
Сервер ->Клиенту : Ну на тебе
Если нет изменений
Сервер ->Клиенту : Ты знаешь, а он и не менялся

Клиент -> Серверу : Дай мне информацию про объект №4, у меня его нет совсем
Если есть изменения
Сервер ->Клиенту : Ну на тебе
Если нет изменений
Сервер ->Клиенту : Ну на тебе

Автор: Bog d`An 9.9.2007, 07:12
ewolf, предполагается что файлы (порядка 3K штук) юзверь заберет в архиве... 

штука требуется для снижения нагрузки и уменьшения трафика...


Diesel Draft, клиент... в смысле браузер такое умеет?

Автор: ewolf 9.9.2007, 13:20
Цитата(Diesel Draft @  8.9.2007,  17:37 Найти цитируемый пост)
ewolf, Зачем делать все так складно. Почему мой вариант вам не нравится.


Как складно, какой ваш вариант? Я предложил изначально использовать кэш браузера.


Bog d`An, то, что описал Diesel Draft и есть кэш браузера. Еще раз повторю, что проверить наличие на компьютере пользователя файл средставми js нельзя.

Автор: Diesel Draft 9.9.2007, 15:58
Bog d`An, Нет, программа написана на чем то, браузер не умеет сохранять.
ewolf, Я не хочу использовать кэш браузера!!!

Автор: ewolf 9.9.2007, 17:45
Diesel Draft, тогда вашу задачу невозможно реализовать.

Автор: Diesel Draft 9.9.2007, 18:07
ewolf, Не обязательно писать на javascript

Автор: sergejzr 9.9.2007, 18:33
Если я правильно понял, то как раз браузерный кэш использовать нежелательно, потому что картинки на сервере могут менятся. (?)

1) Узнать чего либо про диск пользователя, если это не находится в кэше браузера нельзя.

2) Но можно извернуться стандартными методами используя кэш браузера.

Каждый раз запрашивая картинку браузер передаёт заголовки, полученные им когда-то при загрузке этой картинки.

Итак:
Если Браузер заголовки не передал, то картинка запрашивается в первый раз. Мы формируем заголовки сами. У нас есть возможность посадить дату и/или E-Tag - мд5 картинки. 
Посадили заголовки, отдали картинку.
Если браузер заголовки передал, сравниваем дату и/или мд5 с данными картинки на сервере. Если всё совпадает, отдаём заголовок "Not Modified" иначе отдаём картинку.

Таким образом у клиента всегда свежая картинка, а структуру картинок на клиенте создавать не надо.

Архив с картинками весит столько же, сколько сами картинки, поэтому вместо того чтобы его грузить, лучше просто картинки загрузить в невидимый div.



Цитата(Bog d`An @  9.9.2007,  06:12 Найти цитируемый пост)

Diesel Draft, клиент... в смысле браузер такое умеет? 

Это HTTP - Protokoll уже лет 15 как умеет. Для подобного и создавался smile

Автор: ewolf 9.9.2007, 18:50
Но мы не ищем легких путей.

Автор: Diesel Draft 9.9.2007, 19:04
ты не правильно понял

Автор: sergejzr 9.9.2007, 19:26
Цитата(Bog d`An @  6.9.2007,  04:05 Найти цитируемый пост)
файлы расположены определенным образом, так что названия и внутренние каталоги на сервере и диске пользователя совпадают.

В кэше браузера файлы логически лежат точно так же, как на сервере

Цитата(Bog d`An @  6.9.2007,  04:05 Найти цитируемый пост)

Соответственно возможна ситуация когда файл на диске пользователя отсутствует, поврежден или не соответствует файлу на сервере(не был обновлен)... 

С этим как раз с помощью HTTP-Protocol прекрасно бороться 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)