Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Кеширование AJAX запросов (https://javascript.ru/forum/misc/56028-keshirovanie-ajax-zaprosov.html)

KosBeg 26.05.2015 16:14

Кеширование AJAX запросов
 
Всем привет!
Можно ли как нибудь кешировать AJAX запросы, как будто скрипты и стили?
Я имею ввиду, что если ответ поменялся - загрузить его, а если нет - брать из кеша,
Например, при загрузке скриптов и стилей в ответ идет серверный код "304 Not Modified"(если они не поменялись),
А если поменялись - код 200
Можно ли сделать такое для AJAX запросов?
Зарание спасибо :yes:

kostyanet 26.05.2015 17:46

Ничего там не идет с сервера. Сервер не знает что в вашем кеше навалено. Сначала браузер получает хтмл и по нему начинает запрашивать ресурсы сперва проверяя их в кеше. Тут и происходит диалог: браузер - такая картинка байт столько от числа такого-то е? Сервер: такая картинка байт столько от числа такого без изменений. Браузер бамц ее из кеша в рендер...

А вы имеете ввиду не делать вообще запросов если такие же данные уже были получены. Ну так не делайте. Запоминайте по какому-то признаку запросы и что было получено с них и доставайте из переменной по тому самому ключу.

рони 26.05.2015 17:56

KosBeg,
можно но всё одно запрос на сервер будет: пересылка даты из кеша -- сервер отправляет ок или данные если актуальные данные имеют иную дату.
данные+дата => JSON => localStorage
экономия только на ответе сервера и то в случае редко изменяемых данных

KosBeg 26.05.2015 18:09

Цитата:

Сообщение от рони
экономия только на ответе сервера и то в случае редко изменяемых данных

Цитата:

Сообщение от kostyanet
не делать вообще запросов если такие же данные уже были получены

я только что написал одну штучку, которая "кеширует" ответ пока жива "сесия",
"сесия" в даном случае - это пока не закрыли вкладку, или не обновили страницу
var ajax_cache = {};
if(ajax_cache[url]) {
 // используем "кеш"
} else {
 // делаем аякс запрос, и "кешируем" его
 ajax_load(url); // ajax_load() - это условная функция аякс запроса, что бы не писать сюда весь код
 ajax_cache[url] = xhr.responseText;
}

PS: мне не особо подходит, но уже хоть что-то

kostyanet 26.05.2015 18:23

Цитата:

Сообщение от рони
можно но всё одно запрос на сервер будет

Не будет, если кешировать в самом js.

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

kostyanet 26.05.2015 18:28

Цитата:

Сообщение от KosBeg
PS: мне не особо подходит, но уже хоть что-то

ну вот так в общем и делается. Есть еще замороченнее методы, по каким-то там алиасам еще сохраняют. Я когда искал годные лоадеры, насмотрелся на эту хренату. Мне кешировать ничего не надо было, поэтому не осталось, а вообще - дофига.

рони 26.05.2015 18:40

Цитата:

Сообщение от kostyanet
Не будет, если кешировать в самом js.

непонимаю откуда сервер узнает есть у меня данные или нет, если об этом ему не сообщить?

а пока в вашем мире запроса не будет, в моём будет.

kostyanet 26.05.2015 19:03

Цитата:

Сообщение от рони
непонимаю откуда сервер

Харе тупить, ТС сам уже все придумал, там же очевидное решение, которое и в браузерах утилизовано.

Мне, кстати, кеширование не понадобилось просто потому что я проверяю связанные со всем барахлом "классы". То есть например if(typeof Foo == undefined) то подкачать Foo из файла который я указываю подкачать. Когда файл закачивается, в онлоад я делаю Foo и уже второй раз проверка не канает и таким образом оно кагбе и кешируется самопроизвольно. Ну типа lazy binding или как оно там.

kostyanet 26.05.2015 19:11

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

kostyanet 26.05.2015 19:19

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

load=function(e){
		if(loading)
			return;
		page=Math.max(1,page+(this.id.match(/next/)?1:-1));
		if(typeof pages[page]===U) {
			loading=true;
			send_get(location.href+'?page='+page,function(e){
				loading=false;
				if(e.responseText.length>1) {
					var data=JSON.parse(e.responseText);
					pages[page-1]=side_cont.innerHTML;
					side_cont.innerHTML=data.innerHTML;
				}
				else
					stop();
			});
		}
		else
			side_cont.innerHTML=pages[page];
	},


Как обычно написано по-быстрому в расчете потом все причесать и брошено нах, ибо и так работает. :)

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

рони 26.05.2015 19:31

Цитата:

Сообщение от kostyanet
Харе тупить,

Цитата:

Сообщение от kostyanet
например if(typeof Foo == undefined) то подкачать Foo

if(typeof Foo == НЕundefined) отправить дату этого Foo и получить это Foo, либо ок если Foo актуально -- если нет Foo -- то запросить Foo , минуя этап отправки даты.

kostyanet 26.05.2015 19:45

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

Без асинхронных шмаяксов схема вот такая

private $_d=array(); // недоступная проперть

/*
типа геттера, чтоб понятно было в куче все

*/

protected function get_foo(){
    if(!isset($this->_d['foo']))
        $this->_d['foo'] = load('foo'); // or new Foo();
    return $this->_d['foo'];
}


Все, "закешировали", то есть забили в переменную объект и больше ее имя не будет говорить что такой переменной нету.

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

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

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

Кстати в новом YII напропалую вяжут статику в рантайме и пох им на все. Может зря не верю? Вопрос риторический.

kostyanet 26.05.2015 19:57

В смысле вы до логики иф елсе докопались что ли? Ну конкретно там вот так

if(typeof ActiveForm===U){
	loader.css('form');
	loader.js('form',init);
}
else
	init();

рони 26.05.2015 19:58

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

в чате 50 человек у всех 50 просмотрена анкета -- завтра снова 50 человек -- 25 вчерашних 25 новых -- вчерашние в кеше - захочется посмотреть анкета выдаётся мгновенно если в кеше -- те которых нет анкет запрашиваются на сервере и то только в том случае если действительно захотелось просмотреть.

laimas 26.05.2015 20:01

Цитата:

Сообщение от kostyanet
А, вспомнил, я целые страницы кеширую. Там короче статьи загружаются по аяксу и если юзер чота нипонял в статье, которую уже загружал и снова ее выберет, то она не с сервера загрузится, а из массива в js. Что там вообще думать-то? На клиенте памяти как гавна, даже в телефонах как гавна, а текст занимает килобайты.

Опять понос. Да сходи ты к врачу, лечится пора.

kostyanet 26.05.2015 20:07

Блин я же написал с самого начала и ТС особо отметил что речь идет о ресурсах, а не о данных. Вы каким местом читаете?

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

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

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

kostyanet 26.05.2015 20:08

Цитата:

Сообщение от laimas (Сообщение 372555)
Опять понос. Да сходи ты к врачу, лечится пора.

Это у вас перверсия что ли - бегать понос хлебать? Срочно лечите ее медикаментозно!

kostyanet 26.05.2015 20:11

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

Но это - картинки, может быть с десяток мегов. А ваша анкета небось в три раза больше заголовков которые ее обеспечивают. :)

kostyanet 26.05.2015 20:21

Тут видимо непонимание происходит потому что народу глубоко сколько вкачивать в браузер скриптов и стилей на всякий случай. Вкатают в хидер две страницы ссылок на все что найдут у себя иниипет. Зато появляется тема для разговоров о перформансах.


Часовой пояс GMT +3, время: 17:10.