Предотвратите кэширование браузера результата вызова Ajax jQuery

Неустранимая ошибка: допустимый размер памяти из XXX байт исчерпан (пытался выделить XXX байты)

Недостаточно памяти для запуска вашего скрипта. PHP достиг предела памяти и перестает его выполнять. Эта ошибка является фатальной, сценарий останавливается. Значение предела памяти можно настроить либо в файле php.ini, либо с помощью ini_set('memory_limit', '128 M'); в скрипте (который перезапишет значение, определенное в php.ini). Цель ограничения памяти заключается в том, чтобы не допустить, чтобы один скрипт PHP собирал всю доступную память и приводил к остановке всего веб-сервера.

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

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

Вопросы, относящиеся:

249
задан Mark Bell 3 March 2016 в 21:44
поделиться

10 ответов

Я использую new Date().getTime(), который избежит коллизий, если у Вас не будет нескольких запросов, происходящих в той же миллисекунде:

$.get('/getdata?_=' + new Date().getTime(), function(data) {
    console.log(data); 
});

Редактирование: Этому ответу несколько лет. Это все еще работает (следовательно, я не удалил его), но существуют лучшие/более чистые способы достигнуть этого теперь . Мое предпочтение для этот метод, но этот ответ также полезен, если Вы хотите отключить кэширование для каждый запрос в течение времени жизни страницы.

232
ответ дан Community 23 November 2019 в 02:57
поделиться

Конечно, "повреждающие кэш" методы сделают задание, но этого не произошло бы во-первых, если бы сервер указал клиенту, что ответ не должен кэшироваться. В некоторых случаях это выгодно для ответов кэша, несколько раз нет. Позвольте серверу решить корректное время жизни данных. Можно хотеть изменить его позже. Намного легче сделать с сервера, чем от многих различных мест в Вашем коде UI.

, Конечно, это не помогает, если Вы не имеете никакого контроля над сервером.

5
ответ дан Mark Renouf 23 November 2019 в 02:57
поделиться

Маленькое дополнение к превосходным данным ответам: Если Вы работаете с non-ajax решением для резервного копирования за пользователями без JavaScript, необходимо будет получить те заголовки серверной стороны, корректные так или иначе. Это не невозможно, хотя я понимаю тех, которые бросают его;)

я уверен, что существует другой вопрос на том, Так, чтобы дал Вам полный набор заголовков, которые являются соответствующими. Я не полностью conviced miceus, ответ покрывает все основания 100%.

3
ответ дан krosenvold 23 November 2019 в 02:57
поделиться

Что относительно того, чтобы использовать запрос POST вместо ТОГО, ЧТОБЫ ПОЛУЧАТЬ...? (Который Вы должны так или иначе...)

5
ответ дан Thomas Hansen 23 November 2019 в 02:57
поделиться

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

я обычно использую Math.random(), но я не вижу ничто плохого с использованием даты (Вы не должны делать запросов Ajax достаточно быстро для получения того же значения дважды).

13
ответ дан Greg 23 November 2019 в 02:57
поделиться

иначе не должен предоставлять заголовки кэша от серверной стороны в коде, который генерирует ответ на вызов ajax:

response.setHeader( "Pragma", "no-cache" );
response.setHeader( "Cache-Control", "no-cache" );
response.setDateHeader( "Expires", 0 );
23
ответ дан miceuz 23 November 2019 в 02:57
поделиться

Возможно, необходимо посмотреть на $ .ajax () вместо этого (при использовании jQuery на который он похож). Смотрите на: http://docs.jquery.com/Ajax/jQuery.ajax#options и опция "кэш".

Другой подход должен был бы посмотреть на то, как Вы кэшируете вещи на стороне сервера.

4
ответ дан finpingvin 23 November 2019 в 02:57
поделиться

JQuery's $ .get () будет кешировать результаты. Вместо

$.get("myurl", myCallback)

вы должны использовать $ .ajax, который позволит вам отключить кеширование:

$.ajax({url: "myurl", success: myCallback, cache: false});
307
ответ дан Jonathan Moffatt 23 November 2019 в 02:57
поделиться

Следующее предотвратит кэширование всех будущих запросов AJAX независимо от того, какой метод jQuery вы используете ($ .get, $ .ajax и т. д.)

$.ajaxSetup({ cache: false });
508
ответ дан Peter J 23 November 2019 в 02:57
поделиться

Реальный вопрос в том, зачем вам это нужно, чтобы не кэшироваться. Если он не должен кэшироваться, потому что он все время меняется, сервер должен указать, что не следует кэшировать ресурс. Если он просто иногда меняется (потому что может измениться один из ресурсов, от которого он зависит), и если клиентский код имеет возможность узнать об этом, он может добавить фиктивный параметр к URL-адресу, который вычисляется по некоторому хэшу или дате последнего изменения из этих ресурсов Это то, что мы делаем в ресурсах Microsoft Ajax-скриптов, чтобы они могли быть сохранены в кэше навсегда, но новые версии по-прежнему могут обслуживаться по мере их появления). Если клиент не может знать об изменениях, сервер должен правильно обрабатывать запросы HEAD и сообщать клиенту, использовать кэшированную версию или нет. Мне кажется, что добавление случайного параметра или указание от клиента никогда не кэшировать - это неправильно, потому что кэшируемость является свойством ресурса сервера, и поэтому следует принимать решение на стороне сервера. Другой вопрос, который нужно задать себе: должен ли этот ресурс действительно обслуживаться через GET или он должен проходить через POST? Это вопрос семантики, но он также имеет последствия для безопасности (существуют атаки, которые работают, только если сервер допускает GET). POST не будет кэшироваться.

5
ответ дан 23 November 2019 в 02:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: