За последние 24 часа нас посетил 18661 программист и 1601 робот. Сейчас ищет 961 программист ...

Таймер обратного отсчета минуты синхронизация с временем сервера

Тема в разделе "Сделайте за меня", создана пользователем antonio21, 26 сен 2016.

  1. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    Добрый вечер! Нужен таймер обратного отсчета, который выводил бы в реал тайме сколько секунд осталось до завершения минуты, отталкиваясь от времени сервера. И выводил бы это время пользователям.

    Есть таблица в бд в которой прописано время начала и завершения минуты.

    Пробовал ajax ом дергать время сервера, но часто подвисания.

    Помогите пожалуйста с этим таймером, ни как не могу справиться.
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Давно писал я одному новичку таймер, вот, лови. Работает просто - в поле ввода пишется время в будущем/прошлом, от которого надо посчитать разницу к текущему реальному времени. Принимает входящие данные в куче форматов. Попробуй, например, напиши там 28 nov 2017

    Жмакнешь старт - он начнет считать вплоть до миллисекунд, сколько осталось до указанного времени. Ориентируется он на реальное время, а не на таймауты и инетвалы, по этому точен как сатана.

    В общем, как кусок мрамора - просто отсеки все лишнее.
     
  3. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    Ух, слишком лихо, мне просто нужно чтобы он брал время сервера, а точнее только секунды сервера

    PHP:
    1. <?php
    2. echo '<div class="clock">'.date("s")."</div>";
    3. ?>
    и считал сколько осталось до нуля уже у пользователя, как до нуля доходит снова начинает отсчет, потом снова начинал отсчет и так до бесконечности, просто отсчитывает отталкиваясь от времени сервера до нуля и заново.

    А сейчас пользователи php скрипт дергают ajaxом каждую секунду и если инет проседает, то на сайте подвисоны всплывают((
    хочу от этого избавится, а то не прилично так(
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Нужно? Делайте. Заблокируйте поле ввода, либо вообще замените на DIV, а в качестве стартового значения отдавайте ему время сервера.
    И он будет:
    без проседаний и фризов, с точностью атомных часов.

    "Цикличность отсчетов и так до бесконечности" прикрутить тоже не проблема. Вам все карты в руки. Анализируйте логику решения, делайте на ее базе свое. Там не так много работы, как кажется, чтобы адаптировать под ваши нужды.
     
  5. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    Не получилось
    --- Добавлено ---
    Есть готовые решения? Или кто может помочь реализовать?

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

    И нужен еще один таймер который отсчитывает сколько до конца часа, минуты-секунды
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    не пытался
     
  7. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    Прошу все таки помочь реализовать данные таймеры.

    Готов заплатить небольшую деньгу! Заранее благодарен!
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @antonio21 сколько? :rolleyes:

    PHP:
    1. <?php
    2. header('Content-Type: text/html; charset=utf-8');
    3. if($_SERVER['REQUEST_METHOD'] == 'POST') {
    4.     echo rand(1, 59);
    5.     exit;
    6. }
    7. ?>
    8. <!DOCTYPE html>
    9. <html>
    10. <head>
    11.     <title></title>
    12. </head>
    13. <body>
    14.  
    15. <div>countdown <span id="timer">0</span> s.</div>
    16.  
    17. <script type="text/javascript" src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    18. <script type="text/javascript">
    19. function func() {
    20.     $(function() {
    21.         var seconds = $('#timer').text();
    22.         if (seconds > 0) {
    23.             $('#timer').text(--seconds);
    24.             setTimeout(func, 1000);
    25.         } else {
    26.             var jqxhr = $.ajax({
    27.                 url: '<?=$_SERVER['PHP_SELF']?>',
    28.                 data: {'getseconds':'true'},
    29.                 type: 'POST',
    30.             })
    31.             .done(function(seconds) {
    32.                 $('#timer').text(seconds);
    33.                 setTimeout(func, 1000);
    34.             })
    35.             .fail(function() {
    36.                 var conn = confirm("Нет связи с сервером. Повтрить попытку?");
    37.                 if (conn) {
    38.                     setTimeout(func, 1000);
    39.                 }
    40.             });
    41.         }
    42.     });
    43. }
    44.  
    45. setTimeout(func, 1000);
    46. </script>
    47.  
    48. </body>
    49. </html>
     
    antonio21 нравится это.
  9. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    Что это? ))
    --- Добавлено ---
    Отображает сначала : countdown 0 s.
    а через секунду countdown s.

    не совсем то что нужно )) Что не так делаю?
    По деньге, 500 рублей есть! Готов их заплатить за помощь, заранее благодарен!
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    где живой пример? у меня всё работает
    --- Добавлено ---
    хм, 75 мороженок можно купить, круто :p
    --- Добавлено ---
    Вот на runnable выложил http://code.runnable.com/V-5jlWssns5kuiz7/
     
    antonio21 нравится это.
  11. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    На одном сайте отображается на другом нет, буду разбираться.

    Косяк в том что если страницу обновляю один или несколько раз, то таймер сбивается, считает 30, 29, 28 обновляю, 4,3,2,1,0 потом 10,9,8,7 потом снова с 20,19,18.

    Мне важно чтобы он нормально считал, так как когда 00 на сервере на странице действие происходит, а счетчик считает что-то свое не сходится с временем сервера
     
  12. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    Да, жесткий рассинхрон, я вывожу
    $tm = date("s");

    echo '<div class="timemin">
    <div id="tim">'.$tm.'</div></div>';
    и ахахом его дергаю и Ваш скрипт на той же странице, разница секунд 20, ну и цифры постоянно скачут. досчитает до нуля и начинает с 10, потом снова((
    --- Добавлено ---
    Доходит до нуля и начинает считать с 39,38,37,
    как пойдет в общем считает ))
     
  13. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    ну так мой пример у меня хорошо работает и на runnable, ваш я не вижу, так как там всё можно было испортить, задача решена?
     
    antonio21 нравится это.
  14. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    сделал файлик t.php
    PHP:
    1. <?php
    2.  
    3. if($_SERVER['REQUEST_METHOD'] == 'POST') {
    4.     echo rand(1, 59);
    5.     exit;
    6. }
    7. ?>
    Код (Javascript):
    1. function time() {
    2.     $(function() {
    3.         var seconds = $('#timer').text();
    4.         if (seconds > 0) {
    5.             $('#timer').text(--seconds);
    6.             setTimeout(time, 1000);
    7.         } else {
    8.             var jqxhr = $.ajax({
    9.                 url: 't',
    10.                 data: {'getseconds':'true'},
    11.                 type: 'POST',
    12.             })
    13.             .done(function(seconds) {
    14.                 $('#timer').text(seconds);
    15.                 setTimeout(time, 1000);
    16.             })
    17.             .fail(function() {
    18.                 var conn = confirm("Нет связи с сервером. Повтрить попытку?");
    19.                 if (conn) {
    20.                     setTimeout(time, 1000);
    21.                 }
    22.             });
    23.         }
    24.     });
    25. }
    26. setTimeout(time, 1000);
    ну и вывожу на страницу

    <div>countdown <span id="timer">0</span> s.</div>

    И получаю дикий рассинхрон, если сравнивать с временем date("s");
    когда к примеру date("s"); отсчитывает 31,32,33,34
    то скрипт считает вообще мимо, 9,8,7, а должен 29,28,27, и т.д.
    --- Добавлено ---
    Я такой же рассинхрон получаю когда так делал:

    PHP:
    1. <?php
    2. if(!$_SESSION['timer']){
    3.    $_SESSION['timer'] = date("s");
    4. }else if($_SESSION['timer']==0){
    5.     unset($_SESSION['timer']);
    6. }else {
    7.     echo $_SESSION['timer']--;
    8. }
    9.  
    10. ?>
    А мне нужно чтобы он с date("s"); секунда в секунду шел, ну только в обратном порядке, мне же таймер нужен )
     
  15. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    Записал видео, но нельзя прикрепить ))
    Ну сами посмотрите, в общем, и все увидите(
     
  16. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    надо 59 - date("s") делать? Чтобы обратно отсчитал сколько до конца?
    --- Добавлено ---
    @antonio21 видео на ютуб можно выложить
    --- Добавлено ---
    Вот примерно у меня так
    upload_2016-9-30_17-40-8.png
     
    antonio21 нравится это.
  17. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    Да, чтобы он брал date("s") и отсчитывал сколько осталось до 00
    И постоянно синхронизировался с сервером, ну или просто грамотный скрипт который будет точно расчитывать ост время на стороне браузера клиента, важно чтобы он точный был и при большом кол-ве пользователей сервер не мочил.

    Тоже самое с часом, берем date("h:i:s"); и считаем до 00:00:00
    --- Добавлено ---
    Выведите date("s") и посмотрите будет ли рассинхрон?
    Я на разных страничках-сайта пробовал, везде одно и тоже, рассинхрон.
     
  18. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Всё хорошо

    upload_2016-9-30_17-44-12.png
     
    antonio21 нравится это.
  19. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    А в чем тогда проблема может быть?
    Я даже если ваш код беру то у меня рассинхрон и скачут цифры, дойдет до нуля потом с 10ти начнет, потом с 15, потом с 40ка
     
  20. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @antonio21 ну а где я могу посмотреть хотя бы живой пример на вашем сервере?

    Синхронизирует когда доходит до нуля
    --- Добавлено ---
    тут надо websockets поднимать или использовать службы на его основе с API
     
    antonio21 нравится это.
  21. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    А можно чаще его синхронизировать, раз в секунду или раз в 5 секунд ?
    --- Добавлено ---
    Можете здесь посмотреть как работает криво:

    http://live-teatr.ru/timer.php
    --- Добавлено ---
    И когда страницу обновляешь цифры как пойдет выскакивают, то 10, то бах 50, потом 20, хотя между обновлением страницы секунда проходит
     
  22. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    а почему там цифры разные? Как формируется число в t.php и timer.php чтобы не запутаться?

    Можно
     
    antonio21 нравится это.
  23. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    Вот так страничка выглядит

    Код (Text):
    1. <?php
    2. header('Content-Type: text/html; charset=utf-8');
    3. if($_SERVER['REQUEST_METHOD'] == 'POST') {
    4.     echo rand(1, 59);
    5.     exit;
    6. }
    7. ?>
    8. <!DOCTYPE html>
    9. <html>
    10. <head>
    11.     <title></title>
    12. </head>
    13. <body>
    14.  
    15. //Текущие секунды:
    16.  
    17. <div id="t"></div>
    18. <script type="text/javascript">
    19.    function time()
    20.         {
    21.             $.ajax({
    22.                 url: "<?php date("s");?>",
    23.                 cache: false,
    24.                 success: function(html){
    25.                     $("#t").html(html);
    26.                 }
    27.             });
    28.         }
    29.      
    30.         $(document).ready(function(){
    31.             time();
    32.             setInterval('time()',1000);
    33.         });
    34.  
    35. </script>
    36.  
    37. // Ваш скрипт
    38.  
    39. <div>countdown <span id="timer">0</span> s.</div>
    40. <script type="text/javascript" src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    41. <script type="text/javascript" src="tim.js"></script>
    42.  
    43. <script type="text/javascript">
    44. function func() {
    45.     $(function() {
    46.         var seconds = $('#timer').text();
    47.         if (seconds > 0) {
    48.             $('#timer').text(--seconds);
    49.             setTimeout(func, 1000);
    50.         } else {
    51.             var jqxhr = $.ajax({
    52.                 url: '<?=$_SERVER['PHP_SELF']?>',
    53.                 data: {'getseconds':'true'},
    54.                 type: 'POST',
    55.             })
    56.             .done(function(seconds) {
    57.                 $('#timer').text(seconds);
    58.                 setTimeout(func, 1000);
    59.             })
    60.             .fail(function() {
    61.                 var conn = confirm("Нет связи с сервером. Повтрить попытку?");
    62.                 if (conn) {
    63.                     setTimeout(func, 1000);
    64.                 }
    65.             });
    66.         }
    67.     });
    68. }
    69. setTimeout(func, 1000);
    70. </script>
    71. </body>
    72. </html>
    --- Добавлено ---
    Вот и у меня вопрос почему такие цифры разные, не пойму в чем дело((
     
  24. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Потому что там случайное число, ты же сам предложил его на date('s') заменить, по условию задачи лучше на 59 - date('s'); чтобы показывать сколько осталось до конца минуты,

    вот закинь и дай ссылку на это страницу
    PHP:
    1. <?php
    2. header('Content-Type: text/html; charset=utf-8');
    3. if($_SERVER['REQUEST_METHOD'] == 'POST') {
    4.     echo 59 - date("s");
    5.     exit;
    6. }
    7. ?>
    8. <!DOCTYPE html>
    9. <html>
    10. <head>
    11.     <title></title>
    12. </head>
    13. <body>
    14. <div>countdown <span id="timer">0</span> s.</div>
    15. <br>
    16. <div>countdown <span id="timerlive">0</span> s. live</div>
    17. <script type="text/javascript" src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    18. <script type="text/javascript">
    19. $(function() {
    20.      function func() {
    21.         var seconds = $('#timer').text();
    22.         if (seconds > 0) {
    23.             $('#timer').text(--seconds);
    24.             setTimeout(func, 1000);
    25.         } else {
    26.             var jqxhr = $.ajax({
    27.                 url: '<?=$_SERVER['PHP_SELF']?>',
    28.                 data: {'getseconds':'true'},
    29.                 type: 'POST',
    30.             })
    31.             .done(function(seconds) {
    32.                 $('#timer').text(seconds);
    33.                 setTimeout(func, 1000);
    34.             })
    35.             .fail(function() {
    36.                 var conn = confirm("Нет связи с сервером. Повтрить попытку?");
    37.                 if (conn) {
    38.                     setTimeout(func, 1000);
    39.                 }
    40.             });
    41.         }
    42.     }
    43.  
    44.     function funclive() {
    45.         var jqxhr = $.ajax({
    46.             url: '<?=$_SERVER['PHP_SELF']?>',
    47.             data: {'getseconds2':'true'},
    48.             type: 'POST',
    49.         })
    50.         .done(function(seconds) {
    51.             $('#timerlive').text(seconds);
    52.             setTimeout(funclive, 1000);
    53.         });
    54.     }
    55.  
    56.     setTimeout(func, 1000);
    57.     setTimeout(funclive, 1000);
    58.  
    59. });
    60. </script>
    61. </body>
    62. </html>
    --- Добавлено ---
    где live это значение раз в секунду обновляется с сервера, а без live синхронизируется после ноль секунд
     
    antonio21 нравится это.
  25. antonio21

    antonio21 Новичок

    С нами с:
    22 авг 2016
    Сообщения:
    61
    Симпатии:
    0
    еее работает !!! А как такой же таймер на 1 час сделать и на 5 минут?