2015-03-06 2 views
0

Мы используем графическую систему, которая использует SNMP для извлечения данных на график с каждыми пятью минутами. Например, 12:00, 12:05, 12:10 и т. Д. Мы извлекаем график как изображение. Проблема в том, что браузеру нравится использовать кэшированное изображение, и мы не можем получить новое изображение, пока мы не удалим кеш. То, что я пытаюсь сделать, это создать случайный тег для добавления к изображению, что делает его уникальным, поэтому не использует кешированное изображение. Мы могли генерировать случайный тег каждый раз, когда изображение было восстановлено, но это привело к большому количеству использования сервера из всех запросов и более медленному времени отклика. То, что я пытаюсь сделать сейчас, - это генерировать новый тег ТОЛЬКО, если:Обнаружение пятиминутного знака

а) он был больше четырех минут (5+), так как пользователь получил изображение (потому что нужно было пройти пять минут) ,

b) прошло менее пяти минут с момента получения изображения, но с момента последнего получения изображения прошло пять минут. Например, если человек получает изображение в 12:04, он или она не сможет получить новый до пяти минут позже с первым тестом, но второй тест признает, что 12:05 прошло, если он или она пытается получить изображение в 12:06.

Что я пытался сделать, это использовать файл cookie и устанавливать cookie в новый тег каждый раз, когда генерируется новый тег. При загрузке страницы загружалась бы переменная RandomTag со значением cookie. Onclick было бы определено, прошло ли пять минут со времени в переменной RandomTag или если прошло пять минут с момента последнего поколения тега, сгенерируйте новый тег, если он есть, и установите cookie с новым тегом; в противном случае тег не изменится.

Может ли кто-нибудь проверить это и посмотреть, есть ли какие-либо проблемы? Я пробовал этот код, и это заставило мою страницу зависать. Я не знаю, чего мне не хватает. Кроме того, если у вас есть более простой способ сделать это, пожалуйста, дайте мне знать.

Вот пример моего кода:

<body onload="checkCookie()"> 

function getCookie(cname) { 
    var name = cname + "="; 
    var ca = document.cookie.split(';'); 
    for(var i=0; i<ca.length; i++) { 
     var c = ca[i]; 
     while (c.charAt(0)==' ') c = c.substring(1); 
     if (c.indexOf(name) == 0) return c.substring(name.length,c.length); 
    } 
    return ""; 
} 

function setCookie(cname, cvalue, exdays) { 
    var d = new Date(); 
    d.setTime(d.getTime() + (exdays*24*60*60*1000)); 
    var expires = "expires="+d.toUTCString(); 
    document.cookie = cname + "=" + cvalue + "; " + expires; 
} 

function checkCookie() { 
    randomTag = getCookie("timeTag"); 
} 

function tagGet() { 
    timeNow = new Date().getTime(); 
    timeDif = timeNow - randomTag; 
    minNow = timeNow.getMinutes(); 
    minLast = randomTag.getMinutes(); 
    minDif = minNow - minLast; 
    if (timeDif > 29999) { //If 5+ minutes have passed 
     randomTag = timeNow; 
     setCookie("timeTag", timeNow, 365); 
    } 
    else if (timeDif < 30000) { //If less than 5 minutes have passed 
     if (minDif > 0) { //If at least 1 minute has passed since last random tag generation 
      for (y = 0; y < minDif; y++) { //Check to see if a five minute mark has passed by decrementing the current minute mark and comparing it to a five minute mark 
       for (z = 0; z < 60; z += 5) { //Increment by five minute marks for comparison ... 0, 5, 10, etc 
        if (minNow == z) { //If the minute mark now matches a five minute mark 
         randomTag = timeNow;  
         setCookie("timeTag", timeNow, 365); 
        } 
        minNow--; //Decrement minute mark now for comparing next minute mark 
       } 
      } 
     } 
    } 
} 

<a href="#" onClick="tagGet()">#</a> //This is generic 
+0

не является прямым ответом на ваш вопрос js, но перехват кеша обычно выполняется на стороне сервера ... какой стек вы используете на своем сервере? Я думаю о чем-то подобном (я являюсь пользователем hapi js): https://github.com/poeticninja/hapi-cache-buster – tgo

+0

tgo, к сожалению, у меня нет доступа к серверу, поэтому я должен использовать логику на клиенте side – nicholasm5581

+0

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

ответ

0

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

Затем только получить новое изображение, если Date()> = lastImage + (5 * 60 * 1000).

И вы можете использовать Date() в конце URL-адреса для уникального идентификатора, чтобы избежать кеширования.

+0

Единственная проблема заключается в том, что он получит только изображение через пять минут в целом, но не обнаружит, прошла ли пятиминутная метка. Сервер захватывает информацию через SNMP на пятиминутных отметках часа: 12:00, 12:05, 12:10 и т. Д. С вашим решением, если пользователь получает изображение в 12:04, он или она не может получить еще один до 12:09, но обновленное изображение было доступно в 12:05. Мне нужна логика, чтобы определить, прошла ли пятиминутная отметка с момента предыдущего поиска. – nicholasm5581

0

Хорошо. Я нашел ОЧЕНЬ простое решение. В принципе, я просто установил, что моя переменная будет равна последней пятиминутной отметке, округляя текущее время до последней пятиминутной отметки! Дурак я. Ответ был здесь, за исключением того, что я вычитал 2,5 вместо 2,5, так как хочу найти последнюю пятиминутную отметку: Javascript: Round Time UP nearest 5 minutes

Смежные вопросы