XMLHttpRequest не обновляется в интервале JavaScript - PullRequest
0 голосов
/ 18 января 2019

Я использую AJAX для проверки обновлений пользователя каждые 2 секунды, но мой javascript не обновляет ответ.

У меня есть один файл javascript с объектом XMLHttpRequest, и каждые 2 секунды он отправляет запрос в другой файл (.php), где он получает XML с обновлениями. По какой-то причине он не всегда получает новейший контент и, кажется, имеет некоторое старое кеширование.

Мой файл JavaScript содержит этот код (упрощенно):

var updates = new XMLHttpRequest();
updates.onreadystatechange = function(){
    "use strict";
    if(updates.readyState === 4 && updates.status === 200){
        console.log(updates.responseXML);
    }
};

var timer = 0;
clearInterval(timer);
timer = setInterval(function(){
    "use strict";
    updates.open('GET','scripts/check_for_notifications.php', true);
    updates.send();
},2000);

Тогда у меня есть файл PHP ( check_for_notifications.php ), где у меня есть этот код:

$response = new SimpleXMLElement('<xml/>');

$update = $response->addChild('update');
$update->addChild('content', 'New message');
$update->addChild('redirect', 'some link');
$update->addChild('date', '1.1.2019 12:00');

header('Content-type: text/xml');
print($response->asXML());

Каждые две секунды я получаю журнал в своей консоли, но когда я изменяю файл PHP, пока идет интервал ( например, я меняю дату на '1.1.2019 11:00' и сохраняю ее ) Я все еще получаю '12: 00' в консоли. Мне кажется, что он не обновляется и все еще имеет repsonseXML в кеше. Есть ли способ, которым я мог «очистить» вывод, или я делаю это неправильно?

1 Ответ

0 голосов
/ 18 января 2019

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

Чтобы быть уверенным, вы можете добавить элемент в URL, чтобы обойти кеш:

updates.open('GET','scripts/check_for_notifications.php&nocache=' + new Date().getTime(), true);

Если это работает, вам нужно настроить сервер (apache или nginx) для предотвращения кэширования файла. Это чище, чем решение с отметкой времени. браузер не хранит кэшированные файлы без необходимости.

Apache .htaccess или Apache conf, что-то вроде

<Files "check.php">
    <IfModule mod_headers.c>
        Header set Cache-Control "no-cache, no-store, must-revalidate"
        Header set Pragma "no-cache"
        Header set Expires 0
    </IfModule>
</Files>

Nginx conf, что-то вроде

location = /check.php {
    add_header 'Cache-Control' 'no-cache, no-store, must-revalidate';
    expires off;
}

Вы также можете увидеть API извлечения: https://hacks.mozilla.org/2016/03/referrer-and-cache-control-apis-for-fetch/

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

Если запросы занимают более 2 секунд из-за медленной работы сервера, другие запросы тем временем будут отправлены, что еще больше замедлит работу сервера ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...