Почему через длительные промежутки времени интервалы php и js не совпадают?

Вероломство

Весь код примерный максимально приближенный

Есть такой вот реген на php

PHP:
  1. public function regenerateParameter($prop)
  2. {
  3.     // Если текущее значение меньше макисмального, то
  4.     if ($this->{$prop} < $this->{$prop . ‘_max’}) {
  5.         // разницу СЕКУНД текщего времени и времени последнего апдейта умножаем на размер регена
  6.         // для примера $this->{$prop . ‘_reg’} равно 0.1, то есть единица регена каждые 10 секунд
  7.         // в MySQL тип столбцов decimal с возможностью хранить СОТЫЕ для точности хранения чтобы ничего не потерять округлениями
  8.         $this->{$prop} += (time() strtotime($this->datetime_last)) * $this->{$prop . ‘_reg’};
  9.     }
  10.  
  11.     if ($this->{$prop} > $this->{$prop . ‘_max’}) {
  12.         $this->{$prop} = $this->{$prop . ‘_max’};
  13.     }
  14. }
  15.  
  16. // применяем
  17. $this->user->regenerateParameter(‘hp’);
  18. $this->user->regenerateParameter(‘mp’);
  19. $this->user->regenerateParameter(‘hit’);
  20.  
  21. $this->user->save();

кидаем где-то $user в вид и выводим там, например $user->hp

Все эти данные формируются дополнительно в json

PHP:
  1. public function regenerateParameterAction()
  2. {
  3.     $json = [];
  4.  
  5.     $json[‘hp_max’] = $this->user->hp_max;
  6.     $json[‘hp_reg’] = $this->user->hp_reg;
  7.     $json[‘hp’] = $this->user->hp;
  8.     $json[‘mp_max’] = $this->user->mp_max;
  9.     $json[‘mp_reg’] = $this->user->mp_reg;
  10.     $json[‘mp’] = $this->user->mp;
  11.     $json[‘hit_max’] = $this->user->hit_max;
  12.     $json[‘hit_reg’] = $this->user->hit_reg;
  13.     $json[‘hit’] = $this->user->hit;
  14.  
  15.     echo json_encode($json);
  16. }

этот json забирает js и осуществляет анимацию

js

Код (Javascript):
  1. $(function () {
  2.     $.getJSON(‘/json/regenerate-parameter’, function (json) {
  3.         let timer = [];
  4.  
  5.         $.each([‘hp’, ‘mp’, ‘hit’], function (index, element) {
  6.  
  7.             if (parseInt(json[element]) < parseInt(json[element + ‘_max’])) {
  8.                 let now = parseFloat(json[element]);
  9.  
  10.                 timer[index] = setInterval(function () {
  11.                     now += parseFloat(json[element + ‘_reg’]);
  12.  
  13.                     if (parseInt(now) === parseInt(json[element + ‘_max’])) {
  14.                         clearInterval(timer[index]);
  15.                     }
  16.  
  17.                     $(«https://php.ru/forum/threads/pochemu-cherez-dlitelnye-promezhutki-vremeni-intervaly-php-i-js-ne-sovpadajut.91209/#» + element).html(parseInt(now));
  18.                 }, 1000); // <- СЕКУНДА ЧЁРТ ПОБЕРИ
  19.             }
  20.         });
  21.     })
  22. });

Что происходит?

Проходит 10 секунд, анимация показывает +1, обновляем страницу — PHP выводит те же данные, соответствие полное.

Проходит 55 секунд, анимация показывает +5, обновляем страницу — PHP выводит те же данные, соответствие полное, через 5 секунд (так как до следующего +1 осталось 5 секунд) анимация показывает ещё +1, обновляем страницу — PHP выводит те же данные, соответствие полное.

Если было hp — 10, подождать пока анимацией набежит 50-60 и обновить страницу, то всё нормально: js и php работают в синхроне, данные одинаковые как и в описании выше.

Если было hp — 10, подождать пока анимацией набежит 85-90 и обновить страницу, то PHP зафигачивает максимальное значение hp (в данном случае 100), то есть получается, что на php+mysql время полного регена завершилось, а js отстал по каким-то причинам.

С чем это может быть связано и можно ли пофиксить?

 

twim32

Я бы изменил поведение: каждые 10 секунд отправляем запрос, дожидаемся ответа от сервера. Если ответ положительный, обновляем UI.

 

Вероломство

не успел я написать, что решено, спасибо, что уделил внимание :)

короче косяк замечен, когда в другой вкладке браузера у меня шахматы открыты — lichess, если только одна вкладка с проектом, то всё работает отлично

РЕШЕНО

 

twim32

Бывает :)

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *