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

Регистриран на: 08/10/2016 4:31 pm

Support: 6
Bonus: 12
Мнения: 139
Мнение 11/05/2018 9:24 pm      Отговорете с цитат


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



Я обясни с код Smile


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

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

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

PHP code:

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

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

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

]);


Не съм дал целия код на метода защото той няма отношение към въпроса.
PHP code:

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 code:


@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>

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

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

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

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

Support: 83
Bonus: 178
Мнения: 1747
Мнение 14/05/2018 8:41 am      Отговорете с цитат


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

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

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


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

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

Support: 83
Bonus: 178
Мнения: 1747
Мнение 14/05/2018 8:56 am      Отговорете с цитат


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

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


Въпроса е как да взема времето за да мога да го запиша?
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
pix3l
Нов
Нов

Регистриран на: 08/10/2016 4:31 pm

Support: 6
Bonus: 12
Мнения: 139
Мнение 14/05/2018 10:40 am      Отговорете с цитат


Ми както сега си го взимаш... въпрос на един if във front-end-а. Very Happy
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Потребител
Потребител

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

Support: 54
Bonus: 108
Мнения: 699
Мнение 14/05/2018 11:46 am      Отговорете с цитат


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

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

Support: 83
Bonus: 178
Мнения: 1747
Мнение 14/05/2018 11:54 am      Отговорете с цитат


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

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

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


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

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

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

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

Регистриран на: 08/10/2016 4:31 pm

Support: 6
Bonus: 12
Мнения: 139
Мнение 14/05/2018 1:09 pm      Отговорете с цитат


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

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

Support: 54
Bonus: 108
Мнения: 699
Мнение 14/05/2018 2:03 pm      Отговорете с цитат


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


Точно това се случва. Стартира се queue, което трябва да се изпълни с delay което е времето за построяване на сградата. Вместо ръчно да правиш таблицата, Ларавел си прави таблица за тази цел за queue. Така лесно се процесват всякакви queue-та. Ако имаш 200 поребителя строящи сгради, всяко ще си знае кога трябва да се изпълни, без това да пречи на работата на другите.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
pix3l
Нов
Нов

Регистриран на: 08/10/2016 4:31 pm

Support: 6
Bonus: 12
Мнения: 139
Мнение 14/05/2018 2:51 pm      Отговорете с цитат


Изобщо си нямах идея, че има такова нещо в Laravel. Ако ми падне подобна задача, вече ще знам къде да търся. Very Happy
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Потребител
Потребител

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

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


Queues, Task Scheduling, Notifications, Broadcasting... все удобни неща.

Удобно е, защото голяма част, която трябва да правиш ти, е вече имплементирана във фреймуорка.
Колкото повече се познава един фреймуорк, толкова по-функционален става от това да се използват само качествата му на MVC(или какъвто там дизайн използва).

Ако не ползвах Ларавел и аз бих ползвал ръчен подход на този етап от знанията ми. Едно време нещата бяха доста по-зле Very Happy
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
pix3l
Нов
Нов

Регистриран на: 08/10/2016 4:31 pm

Support: 6
Bonus: 12
Мнения: 139
Мнение 14/05/2018 6:52 pm      Отговорете с цитат


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


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