Laravel background jobs

C++ JAVA
pix3l
Нов
Нов
Posts: 143
Joined: Sat Oct 08, 2016 2:31 pm

Post by pix3l » Fri May 11, 2018 7:24 pm

teroristd wrote:
Fakeheal wrote:
teroristd wrote:Отказах се от vue и вместо това направих таймера с jquery. Сложих клик функция на бутона, сметнах времето и т.н. обаче изникна един проблем. Рут-а на бутона сочи към функцията в която викам queue-то, и за това на края на функцията завършвам с return redirect()->back(); за да се върна на главния рут. Обаче така прецаквам клик-а на jquery-то, то се стартира и спира защото след рефреша не е кликнато. Какво мога да направя?

Я обясни с код :)
При клик се изпълнява рута на ъпдейта, а при redirect()->back() се връща на главния, което рефрешва страницата, и jquery таймера който е стартиран при клика, след рефреша изчезва.

Искам само да добавя че delay-а на Job-a няма нищо общо с jquery таймера, който ще го използвам просто да визуализира необходимото време за построяването на сградата.

И още нещо да добавя :D, ако няма клик функция на jquery таймера той си се стартира веднага и рефреша не му пречи, но така не ми върши работа.

[php]
//Това е главния рут който връща вю-то.
Route::get('/home', 'HomeController@index')->name('home');

//Това е рута за ъпдейта на сградата
Route::get('/home/goldMineUpdate', [

'uses' => 'HomeController@goldMineUpdate',
'as' => 'gold.mine.update'

]);
[/php]

Не съм дал целия код на метода защото той няма отношение към въпроса.
[php]
public function goldMineUpdate()
{
$job = (new CreateGoldMineJob($user_id))->delay(300);
dispatch($job);

Session::flash('success', 'The gold mine was updated successfuly');

return redirect()->back();
}
[/php]

Това е блейда. Пак не съм дал целия код, но грубо часовника получава времето и при клик почва да тече.
[php]

@php
date_default_timezone_set('Europe/Sofia');
$date = date('Y-m-d H:i:s');
$currentDate = strtotime($date);
$futureDate = $currentDate + (60 * 5);
$formatDate = date("Y-m-d H:i:s", $futureDate);
@endphp


@if($mine->gold_mine == 0)
@php $time = $formatDate; @endphp
@endif

<a href="{{route('gold.mine.update')}}" id="target_one">
Update
</a>

<script>

var time = {!! json_encode($time) !!}

$("#target_one").click(function () {
$('#clock').countdown(time, function (event) {
var totalHours = event.offset.totalDays * 24 + event.offset.hours;
$(this).html(event.strftime(totalHours + ' ч. %M мин. %S сек.'));
});
});

</script>
[/php]
Не съм чел цялата тема, постът ми е насочен конкретно към тоя ти пост...

Какво ти пречи при зареждането на страницата да проверяваш дали се строи сграда и да пускаш таймера ако има такава. Ако няма нищо за строене, закачаш клик евента и готово.

Аз поне така ти разбрах проблема.

User avatar
teroristd
Много Редовен
Много Редовен
Posts: 1769
Joined: Thu Feb 18, 2010 11:50 am
Answers: 83

Post by teroristd » Mon May 14, 2018 6:41 am

pix3l wrote:Не съм чел цялата тема, постът ми е насочен конкретно към тоя ти пост...

Какво ти пречи при зареждането на страницата да проверяваш дали се строи сграда и да пускаш таймера ако има такава. Ако няма нищо за строене, закачаш клик евента и готово.

Аз поне така ти разбрах проблема.
Така както си предложил от един стават два проблемите :). Първо не виждам как ще взема оставащото време от delay() ако се строи сграда за да пусна таймер. Второ както съм писал по горе клик евента изчезва при рефреш.

User avatar
teroristd
Много Редовен
Много Редовен
Posts: 1769
Joined: Thu Feb 18, 2010 11:50 am
Answers: 83

Post by teroristd » Mon May 14, 2018 6:56 am

Revelation wrote:Навръзването може да е много лесно, може да е и много сложно. Така или иначе трябва да записваш някъде постоянно или в определен event изминалото време. Естествено, не е добра идея да е в базата данни.

В момента за такива неща е най-готино да се ползва Redis или някоя друга NoSQL база данни.
Въпроса е как да взема времето за да мога да го запиша?

pix3l
Нов
Нов
Posts: 143
Joined: Sat Oct 08, 2016 2:31 pm

Post by pix3l » Mon May 14, 2018 8:40 am

Ми както сега си го взимаш... въпрос на един if във front-end-а. :D

User avatar
Revelation
Потребител
Потребител
Posts: 777
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 57

Post by Revelation » Mon May 14, 2018 9:46 am

Както го взимаш, за да го подадеш на delay().

User avatar
teroristd
Много Редовен
Много Редовен
Posts: 1769
Joined: Thu Feb 18, 2010 11:50 am
Answers: 83

Post by teroristd » Mon May 14, 2018 9:54 am

Ама аз на delay му подавам просто секундите които искам да изчака. Това което не мога да разбера е как ще знам колко секунди са минали във всеки един момент и какво точно трябва да запиша в redis?

User avatar
Revelation
Потребител
Потребител
Posts: 777
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 57

Post by Revelation » Mon May 14, 2018 10:27 am

Секундите, които трябва да изчака, са ти секундите за построяване на сградата. Същите секунди трябва да ги използваш за брояча. Просто трябва да ги записваш някъде при определен евент(да речем играча е излязал от играта нацяло, играча е отишъл на друга страница). Идеята е да засечеш времето между когато потребителя е бил на страницата и потребителя не е бил на страницата(където върви таймера), за да можеш да изчислиш после правилно оставащото време и съответно, ако е по-голямо от времето за построяване на сградата, това значи, че е построена, иначе таймера продължата от където е стигнал след последния запис.

Според мен остави за сега Редис, защото е прекалено сложен за теб на този етап.

Ако искаш си използвай за сега MySQL, направи си една таблица, в която да записваш тези данни и готово.

Напъни се малко повече. Записвай си на листче. Нали идеята е да се научиш. Трябва да те накараме да започнеш да мислиш логически, иначе каква е файдата, ако ти даваме изцяло отговорите.

pix3l
Нов
Нов
Posts: 143
Joined: Sat Oct 08, 2016 2:31 pm

Post by pix3l » Mon May 14, 2018 11:09 am

Не мога да разбера защо е този delay...
Ако на мен ми се налагаше да правя подобно нещо, бих си направил една таблица, където да слагам задачите за строене на сградите. Там имам building_id, start_date, end_date. Когато си взимам сградите от основната таблица, която държи сградите на юзърите, просто проверявам за накакъв флаг, който показва дали сградата е завършена... ако не е, взимам оставащото време от таблицата със задачите и готово.
Правя си един Cron, който да минава и да зачиства през определен интервал, в случай, че има нещо за чистене. Няма delay, няма нищо...

User avatar
Revelation
Потребител
Потребител
Posts: 777
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 57

Post by Revelation » Mon May 14, 2018 12:03 pm

pix3l wrote:Не мога да разбера защо е този delay...
Ако на мен ми се налагаше да правя подобно нещо, бих си направил една таблица, където да слагам задачите за строене на сградите. Там имам building_id, start_date, end_date. Когато си взимам сградите от основната таблица, която държи сградите на юзърите, просто проверявам за накакъв флаг, който показва дали сградата е завършена... ако не е, взимам оставащото време от таблицата със задачите и готово.
Правя си един Cron, който да минава и да зачиства през определен интервал, в случай, че има нещо за чистене. Няма delay, няма нищо...
Точно това се случва. Стартира се queue, което трябва да се изпълни с delay което е времето за построяване на сградата. Вместо ръчно да правиш таблицата, Ларавел си прави таблица за тази цел за queue. Така лесно се процесват всякакви queue-та. Ако имаш 200 поребителя строящи сгради, всяко ще си знае кога трябва да се изпълни, без това да пречи на работата на другите.

pix3l
Нов
Нов
Posts: 143
Joined: Sat Oct 08, 2016 2:31 pm

Post by pix3l » Mon May 14, 2018 12:51 pm

Изобщо си нямах идея, че има такова нещо в Laravel. Ако ми падне подобна задача, вече ще знам къде да търся. :D

Post Reply