Таймер обратного отсчета с временем из БД и занесением данных в БД каждый час

231
20 февраля 2018, 08:31

Здравствуйте делаю счетчик обратного отсчета , суть счетчика заключается в том чтобы отсчитывать ровно 1 час и выполнять определенное действие. время лежит в БД и берется запросом. Вот код подсчета времени:

<? 
$email = $_SESSION['username']; 
$vremya = mysqli_fetch_array(mysqli_query($db, "select * from time where id = '1'")); 
$wait = mysqli_fetch_array(mysqli_query($db, "select * from settings where `set` = 'wait'")); 
$timech = time(); // время сейчас в сайтстамп 
$tmm = $timech - $vremya['time']; // время сейчас - время до срабатывания = прошедшее время 
$rtt =  $wait['value'] - $tmm; // время до срабатывания 
 
echo date('i:s',$rtt); 
 
				?>

echo все выводит правильно, помогите прикрутить это время на JS вот код счетчика ни как не могу их свести вместе. Если беру время из базы постоянно пишет что время вышло и счетчик по нулям

< div id = 'mytimer' > 
  < 
  script src = "/style/jquery.countdown.js" 
type = "text/javascript" > < /script> < 
  script type = "text/javascript" > 
 
  function countDown(second, endMinute, endHour, endDay, endMonth, endYear) { 
    var now = new Date(); 
    second = (arguments.length == 1) ? second + now.getSeconds() : second; 
    endYear = typeof(endYear) != 'undefined' ? endYear : now.getFullYear(); 
    endMonth = endMonth ? endMonth - 1 : now.getMonth(); //номер месяца начинается с 0    
    endDay = typeof(endDay) != 'undefined' ? endDay : now.getDate(); 
    endHour = typeof(endHour) != 'undefined' ? endHour : now.getHours(); 
    endMinute = typeof(endMinute) != 'undefined' ? endMinute : now.getMinutes(); 
    //добавляем секунду к конечной дате (таймер показывает время уже спустя 1с.)  
    var endDate = new Date(endYear, endMonth, endDay, endHour, endMinute, second + 1); 
    var interval = setInterval(function() { //запускаем таймер с интервалом 1 секунду 
      var time = endDate.getTime() - now.getTime(); 
      if (time < 0) { //если конечная дата меньше текущей 
        clearInterval(interval); 
        alert("Неверная дата!"); 
      } else { 
        var days = Math.floor(time / 864e5); 
        var hours = Math.floor(time / 36e5) % 24; 
        var minutes = Math.floor(time / 6e4) % 60; 
        var seconds = Math.floor(time / 1e3) % 60; 
        var digit = '<div style="width:70px;float:left;text-align:center">' + 
          '<div style="font-family:Stencil;font-size:65px;">'; 
        var text = '</div><div>' 
        var end = '</div></div><div style="float:left;font-size:45px;">:</div>' 
        document.getElementById('mytimer').innerHTML = '<div>осталось до выбора: </div>' + 
 
          digit + minutes + text + 'Минут' + end + digit + seconds + text + 'Секунд'; 
        if (!seconds && !minutes && !days && !hours) { 
          clearInterval(interval); 
          alert("Время вышло!"); 
        } 
      } 
      now.setSeconds(now.getSeconds() + 1); //увеличиваем текущее время на 1 секунду 
    }, 1000); 
  } 
countDown(3600); //устанавливаем таймер на 3600 секунд 
< 
/script> < 
/div>

Может есть какие нибудь другие варианты выполнения этой задачи, основная задача счетчика: 1.отсчитать ровно час.( от любого времени главное что час отсчитывал) 2. Выполнить запись в БД и отсчитывать опять час. (смысл, каждый час по счетчику заносятся данные в БД ) Но чтоб этот счетчик был виден на сайте всем пользователям. Может есть простое решение без костылей которые я тут понаписал? Подскажите хоть куда копать, толком на гуглить ничего не смог ))

Answer 1

Ваша задача не должна решаться средствами PHP или javascript, тем более если отсчет никак не зависит от действий пользователей. Как это решить - зависит от используемой ОС и СУБД на backend.

  1. Средствами OS Linux можно решить, используя CRON или подобные утилиты, как это сделать - множество статей в инете, достаточно поискать cron schedule job - например тут хор статья.

  2. Средствами СУБД, если вы используете PostgreSQL (а если нет - срочно примите меры чтобы использовать:-) - можно задействовать

    2.1. pg_cron

    SELECT cron.schedule('30 3 * * 6', $$UPDATE counter set cnt = cnt + 1 ... '1 hour'$$);

    2.2. PgAgent - он устанавливается отдельно и используется для планирования всевозможных задач, типа резервного копирования или профилактики базы данных, опять же, статей масса, эта подойдёт чтобы вникнуть.

READ ALSO
Node JS, return из модуля

Node JS, return из модуля

Добрый деньЯ новичок в Node , сильно не критикуйте

226
Почему возникает ошибка типа &ldquo;cannot read property style of null&rdquo;?

Почему возникает ошибка типа “cannot read property style of null”?

Выдаёт ошибку типа "cannot read property style of null"Что пытаюсь сделать: после движения мышкой к курсору должно прилипнуть изображение (сначала прописал...

195
Определить состояние чекбокса

Определить состояние чекбокса

Есть кастомный чекбокс на сайте, по клику на который необходимо узнать активный он или нетПишу следующие:

248