- Laravel background jobs part 2
WT форуми -> PHP MySQL ASP.NET -> Laravel background jobs part 2
Създайте нова тема Напишете отговор 
Автор Съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 83
Bonus: 178
Мнения: 1741
Мнение 25/05/2018 12:07 pm     Laravel background jobs part 2 Отговорете с цитат


Епизод 2 Very Happy.

За тези които не са запознати с първа част предоставям резюме.

Имам queue което изпълнява задачи. Използвам delay за да забавя изпълнението на задачите определено време. Независимо от queue-то имам jquery брояч, който използвам да визуализирам времето оставащо до изпълнението на задачите. След като изтече времето с javascript рефрешвам страницата за да се актуализират промените в базата данни.

Тук ще отбележа някои подробности. Инсталирах си PHP-Vars-To-Js-Transformer, който се оказа супер удобен. Подавам в един обект променливи, които после си използвам в javascript без да правя никакви врътки и щуротии Very Happy.

Стигаме до настоящия проблем. Получава се рзлика около секунда и половина между queue-то и jquery брояч-а. Queue-то е по-бавно, и рефреша се изпълнява преди да са се случили промените в базата. За това реших да забавя рефреша чрез setTimeout с две секунди. Всичко е наред ако не се рефрешва ръчно страницата, иначе на всеки рефреш тези две секунди се натрупват по някакъв начин. По принцип съм готов и на различно решение на проблема.

Нека да кажа малко и за времената.
Queue-то приема число(секунди) за delay-а. Например 20 е давадесет секунди.
Докато jquery брояч-а приема дата. Например 2018/05/25 20:10:25.
Накрая setTimeout-а приема число(милисекунди). Например 2000 е две секунди.

Ето и как подавам променливите.
За queue-то просто си взимам левела на сградата от базата и според него сетвам секундите.
За setTimeout-а по същия начин, с тази разлика че неговата променлива я слагам и в javascript обекта.
PHP code:

if ($mines_levels[0]['gold_mine'] == 0)
{
$this->_num = 5; // За queue-то
$this->_jsNum = 7000; // За setTimeout-а
}

За jquery брояч-а е малко по-сложно. Във метода където се извършва ъпдейта на базата, използвам redis за да записвам крайната дата (само когато е натиснат бутона), слад което го подавам на javascript обекта.
PHP code:

$this->_redis->set('endDate', $this->_endDate);

Ето и как стигам до точното число. Няма да обяснявам подробно, от кода се разбира.
PHP code:

date_default_timezone_set('Europe/Sofia');
$this->_date = strtotime(date('Y-m-d H:i:s')) + $this->_num;
$this->_endDate = date("Y-m-d H:i:s", $this->_date);
$this->_goldMineTime = $this->_redis->get('endDate');


Еми това е в общи линии. Ето и javascript-a.
PHP code:

// goldMineTime e датата за таймера
$('#clock').countdown(goldMineTime, function (event) {
var totalHours = event.offset.totalDays * 24 + event.offset.hours;
$(this).html(event.strftime(totalHours + ' h. %M m. %S s.'));
});

// jsNum е времето за setTimeout-а
var timeoutHandle = window.setTimeout(location.reload.bind(location), jsNum);
$('div#clock').countdown(goldMineTime).on('stop.countdown', timeoutHandle);
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Потребител
Потребител

Регистриран на: 24/03/2013 3:23 pm

Support: 54
Bonus: 108
Мнения: 698
Мнение 25/05/2018 1:26 pm      Отговорете с цитат


1. Не използвай разни библиотеки за разни неща, ако фреймуорка ти предоставя функционалността.
Какво имам предвид. Illuminate\Support\Facades\View фасадата ти предоставя статичен share метод, с който можеш да споделяш променливи във всички вюта.
Като все пак си мисля, че нещата не трябва да стоят по този начин, както си ги направил, но да оставим това сега настрана.

2. По мое мнение, разликата идва заради различното предоставяне на времената. Гледай да ги нормализираш до един вид (unix timestamp - микро секунди).

3. Като стартираш да строиш някоя сграда презареждаш ли страницата?
3.1. Ако да, то използвай self-invoking function, за да стартираш брояча веднага, когато се стигне до него, а не да чака да зареди DOM-а.
Вече чак като зареди DOM-а, можеш да вземеш текущата стойност и да я визуализираш, но стартирането да таймера трябва да стане незабавно.

Моя съвет е, такива процеси да ги стартираш чрез AJAX, за да може да избягваш такива разлики във времето.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 83
Bonus: 178
Мнения: 1741
Мнение 25/05/2018 1:38 pm      Отговорете с цитат


Revelation написа:
1. Не използвай разни библиотеки за разни неща, ако фреймуорка ти предоставя функционалността.
Какво имам предвид. Illuminate\Support\Facades\View фасадата ти предоставя статичен share метод, с който можеш да споделяш променливи във всички вюта.

Да обаче нe мога да ги ползвам в javascript.

Revelation написа:

2. По мое мнение, разликата идва заради различното предоставяне на времената. Гледай да ги нормализираш до един вид (unix timestamp - микро секунди).

3. Като стартираш да строиш някоя сграда презареждаш ли страницата?
3.1. Ако да, то използвай self-invoking function, за да стартираш брояча веднага, когато се стигне до него, а не да чака да зареди DOM-а.
Вече чак като зареди DOM-а, можеш да вземеш текущата стойност и да я визуализираш, но стартирането да таймера трябва да стане незабавно.

Моя съвет е, такива процеси да ги стартираш чрез AJAX, за да може да избягваш такива разлики във времето.


Тука в случая се бави queue-то, а не jquery таймера.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Потребител
Потребител

Регистриран на: 24/03/2013 3:23 pm

Support: 54
Bonus: 108
Мнения: 698
Мнение 25/05/2018 3:35 pm      Отговорете с цитат


Не ги ползваш правилно, за това. Very Happy Няма значение, сега не е важна архитектурата.

Т.е. искаш да кажеш, че таймера свършва, презарежда, но Queue-то не е приключило и де факто няма ъпдейт?
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 83
Bonus: 178
Мнения: 1741
Мнение 25/05/2018 5:28 pm      Отговорете с цитат


Да
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Потребител
Потребител

Регистриран на: 24/03/2013 3:23 pm

Support: 54
Bonus: 108
Мнения: 698
Мнение 25/05/2018 6:45 pm      Отговорете с цитат


А винаги ли е еднакво времето - 1.5сек.? Ако е винаги, countdown-а би трябвало да има onComplete event, в който трябва да изпълниш редиректа със setTimeout 1500ms.


П.П. Нещо не разбирам защо имаш 2 countdown-а. И в първия какво е това време и какви са тези bind-ове по setTimeout. Излишна логика виждам тука.

Разясни малко с коментари по кода.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 83
Bonus: 178
Мнения: 1741
Мнение 25/05/2018 7:19 pm      Отговорете с цитат


Revelation написа:
А винаги ли е еднакво времето - 1.5сек.? Ако е винаги, countdown-а би трябвало да има onComplete event, в който трябва да изпълниш редиректа със setTimeout 1500ms.


П.П. Нещо не разбирам защо имаш 2 countdown-а. И в първия какво е това време и какви са тези bind-ове по setTimeout. Излишна логика виждам тука.

Разясни малко с коментари по кода.


Знаеш че javascripta не ми е сила Very Happy. В случая нещо не можах да ги обединя onComplete-а с таймера, но и така работи. За bind-а го видях в stackoverflow и не знам какво точно се случва но без него(как да го кажа) върти иконката за рефреш на браузъра Very Happy. Всичко работи, но единствения проблем е че ако докато върви countdown-а, ръчно рефрешвам страницата в setTimeout-а се натрупва време. Ако не пипам нищо две секунди след спирането на countdown-а си се рефрешва страницата и всичко е ок. Ако обаче примерно рефрешна переди това един път после чакам четири секунди и т.н.
PHP code:

// Това е същинският countdown който визуализирам
$('#clock').countdown(goldMineTime, function (event) {
var totalHours = event.offset.totalDays * 24 + event.offset.hours;
$(this).html(event.strftime(totalHours + ' h. %M m. %S s.'));
});

// Това е onComplete event-а
var timeoutHandle = window.setTimeout(location.reload.bind(location), jsNum);
$('div#clock').countdown(goldMineTime).on('stop.countdown', timeoutHandle);
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Потребител
Потребител

Регистриран на: 24/03/2013 3:23 pm

Support: 54
Bonus: 108
Мнения: 698
Мнение 25/05/2018 10:00 pm      Отговорете с цитат


Ти яко мажеш нещата. Very Happy Very Happy Не се прави така.


Javascript code:

$('#clock').countdown(goldMineTime)
.on('update.countdown', function (e) {
let totalHours = event.offset.totalDays * 24 + event.offset.hours;
$(this).html(event.strftime(totalHours + ' h. %M m. %S s.'));
})
.on('finish.countdown', function (e) {
setTimeout(function () {
window.location.reload();
}, 1500);
});


Това totalHours нямам идея защо ти е. %-H би трябвало да ти свърши работа.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 83
Bonus: 178
Мнения: 1741
Мнение 26/05/2018 4:03 pm      Отговорете с цитат


Revelation написа:
Ти яко мажеш нещата. Very Happy Very Happy Не се прави така.


Javascript code:

$('#clock').countdown(goldMineTime)
.on('update.countdown', function (e) {
let totalHours = event.offset.totalDays * 24 + event.offset.hours;
$(this).html(event.strftime(totalHours + ' h. %M m. %S s.'));
})
.on('finish.countdown', function (e) {
setTimeout(function () {
window.location.reload();
}, 1500);
});


Това totalHours нямам идея защо ти е. %-H би трябвало да ти свърши работа.


Така не работи, не знам защо. totalHours е за да показва часове когато са повече от 24, а не дни. Така си е в примера и аз така искам Smile .

Edit

Оправих го, трябвало е вместо function (e) да е event.

Благодаря.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Потребител
Потребител

Регистриран на: 24/03/2013 3:23 pm

Support: 54
Bonus: 108
Мнения: 698
Мнение 26/05/2018 9:34 pm      Отговорете с цитат


teroristd написа:
Revelation написа:
Ти яко мажеш нещата. Very Happy Very Happy Не се прави така.


Javascript code:

$('#clock').countdown(goldMineTime)
.on('update.countdown', function (e) {
let totalHours = event.offset.totalDays * 24 + event.offset.hours;
$(this).html(event.strftime(totalHours + ' h. %M m. %S s.'));
})
.on('finish.countdown', function (e) {
setTimeout(function () {
window.location.reload();
}, 1500);
});


Това totalHours нямам идея защо ти е. %-H би трябвало да ти свърши работа.


Така не работи, не знам защо. totalHours е за да показва часове когато са повече от 24, а не дни. Така си е в примера и аз така искам Smile .

Edit

Оправих го, трябвало е вместо function (e) да е event.

Благодаря.


О, недогледал съм като съм писал кода. А иначе за часовете %H или %-H не ти ли вършат работа?

И оправи ли се проблема ти?
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
teroristd
Редовен
Редовен

Регистриран на: 18/02/2010 1:50 pm

Support: 83
Bonus: 178
Мнения: 1741
Мнение 26/05/2018 10:52 pm      Отговорете с цитат


Revelation написа:
teroristd написа:
Revelation написа:
Ти яко мажеш нещата. Very Happy Very Happy Не се прави така.


Javascript code:

$('#clock').countdown(goldMineTime)
.on('update.countdown', function (e) {
let totalHours = event.offset.totalDays * 24 + event.offset.hours;
$(this).html(event.strftime(totalHours + ' h. %M m. %S s.'));
})
.on('finish.countdown', function (e) {
setTimeout(function () {
window.location.reload();
}, 1500);
});


Това totalHours нямам идея защо ти е. %-H би трябвало да ти свърши работа.


Така не работи, не знам защо. totalHours е за да показва часове когато са повече от 24, а не дни. Така си е в примера и аз така искам Smile .

Edit

Оправих го, трябвало е вместо function (e) да е event.

Благодаря.


О, недогледал съм като съм писал кода. А иначе за часовете %H или %-H не ти ли вършат работа?

И оправи ли се проблема ти?


Да проблема е решен. А иначе за часовете %H или %-H не ми вършат работа, защото за по-голямо време от 24 часа ми трябва и поле за дни, а аз не искам. Така както е ще показва сбора от часовете.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Потребител
Потребител

Регистриран на: 24/03/2013 3:23 pm

Support: 54
Bonus: 108
Мнения: 698
Мнение 27/05/2018 12:15 am      Отговорете с цитат


Еми тогава използвай %I Very Happy Very Happy Не четеш документациите хубаво, момче. Very Happy
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Покажи мнения от преди:    
Създайте нова тема   Напишете отговор    web-tourist.net Форуми -> PHP MySQL ASP.NET Часовете са според зоната GMT + 2 Часа
Страница 1 от 1


 
Идете на:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети