Laravel background jobs

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

Post by teroristd » Fri Apr 27, 2018 4:57 am

Revelation wrote:
teroristd wrote::D не в смисъл командата работи, но се изпълнява един път. Явно трябва да мисля нещо друго. Имам VMware на лаптопа. Дали ще свърши някаква работа?
Между другото, използвай така task scheduler-а и ще се оправи.
schtasks /create /sc minute /mo 1 /tn "Laravel Scheduler" /tr "php C:\xampp\htdocs\Game\artisan schedule:run"
Сега го тествах и проверих логовете и разбрах защо не се получава.
Така написан скеджълъра си работи идеално при мен.

П.П. Оказа се, че schedule:run си разпознава операционната система и си добавя нужните параметри след това. За това е нужно само да си се вика schedule:run.
Благодаря, и при мен работи. Сега трябва да се върна към схемата която ми изпрати, и да продължа към следващата част на задачката :) .

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

Post by teroristd » Fri Apr 27, 2018 9:11 am

Горе долу схванах картинката, само не разбрах как да стартирам втората задача при клик от юзъра?

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 786
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 57

Post by Revelation » Fri Apr 27, 2018 12:11 pm

Правиш си Queue Job(UpdateResourcesPerMin), който ъпдейтва resources_per_min, като в контролера ще му подаваш user_id.

Правиш си един контролер, който приема като параметър коя сграда е пусната. Да речем:

[php]
class BuildingController extends Controller {
public function build(Building $building) {
UpdateResourcesPerMin::dispatch([
'user_id' => app()->user()->id,
'mine' => $building // за да знаеш кое поле да обновиш
])->delay(now()->addMinutes($building->getDuration()));
}
}
[/php]

и в рутера да речем можеш да използваш GET или POST в зависимост как си изградиш нещата.

[php]
Route::get('/build/{building}', 'BuildingController@build');
[/php]

и следователно

[html]
<a href="{{ url('build', ['building' => 'gold']) }}">Build Gold Mine</a>
[/html]

Нещата съм ги написал просто образно. Доста неща ще трябва да обмислиш как да ги направиш, като например Building $building какво трябва да е, за да взимаш правилната сграда/ферма и да взимаш правилните данни, като getDuration().

Но се надявам, че хвана картинката как да извикаш queue-то.

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

Post by teroristd » Fri Apr 27, 2018 12:17 pm

Да горе долу схванах :), но ще се стартира ли Queue-то ако викам dispatch извън Scheduler-а? Питам защото четох че за да стартираш Queue трябва да подадеш команда php artisan queue:work.

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

Post by teroristd » Fri Apr 27, 2018 12:43 pm

Значи Queue-то се изпълнява но само един път защото е извън Scheduler-а.

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 786
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 57

Post by Revelation » Fri Apr 27, 2018 12:52 pm

Ти не ти трябва Scheduler-а за тази цел. Просто му задай delay(now()->addMinutes(time)) като time е времето, за което трябва да се построи сградата.

А иначе, за да работи правилно queue, трябва да си направиш таблица в базата данни:

[php]
php artisan queue:table
php artisan migrate
php artisan queue:work
[/php]

иначе дори и да сложиш delay няма да работи правилно и ще вика веднага dispatch().

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

Post by teroristd » Fri Apr 27, 2018 1:09 pm

Аз съм му направил таблицата, но тука проблема е че когато е извън sceduler-a трябва да му подам командата ръчно. Разбираш ли ме какво имам на предвид?

За да го обясня по цветно, в началото като стартирам scheduler-a почва да се трупа злато през една минута, но камъните си стоят нула. Целта е когато играча построи мината да се стартира втората задача и да почнат да се трупат и камъни, но това не се случва защото queue-to е извън цикъла.

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 786
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 57

Post by Revelation » Fri Apr 27, 2018 1:43 pm

Ще опитам да ти разясня отново стъпка по стъпка:

0. Тази задача не трябва да участва в scheduler-а. За да се изпълняват queue работите, трябва да имаш стартиран php artisan queue:work

1. Queue работата(ще я кръстя UpdateResourcesPerMinJob) има за цел да ти вземе данните(взети и подадени от контролера), да речем user_id и името на сградата - да речем gold(това ще е името и на полето ти в базата данни, което ще трябва да се ъпдейтне), както също и данни като например след като се построи сградата с колко трябва да увеличиш полето gold.

2. Правиш си контролер, на който работата му ще е да строи сгради. В него идеята е да извикаш UpdateResourcesPerMinJob и да го dispatch()-неш като на dispatch() подаваш нужните данни(user_id, building name и т.н., като ти препоръчвам building да е обект, с който да можеш да работиш в самото queue) + му закачаш един delay(), който ще е времето, което ще е нужно да се построи сградата. Така, когато натиснеш бутона за построяване, де факто dispatch()-ваш опашката. По-лесно казано, регистрираш я в базата данни и queue:work вече ще знае кога тази опашка трябва да се извика и да се изпълни.
И вече, да речем, ако на сградата са и били нужни 5мин. да се построи, след тези 5мин. опашката ще се изпълни, ще ти ъпдейтне таблицата resources_per_min за съответната колона(име на сграда) и оттам вече, теб не те интересува scheduler-а какво върши, защото той си изпълнява неговата работа да вика командата, която ъпдейтва ресурсите на потребитела. Съответно, след като се ъпдейтне таблица след построяването на сградата, при следващия тик на scheduler-а, той просто ще си вземе новите данни от базата данни ще ъпдейтва според това, какво има там.


Аз май няколко точки ги обясних в т.2, но са просто навързани.

Надявам се, че започваш да разбираш за какво говоря. Ако не, ще видя, ако ми остане някакво време да ти го реализирам, но ти препоръчвам да се справиш сам, за да разбереш процеса на работа.

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

Post by teroristd » Fri Apr 27, 2018 2:49 pm

Revelation wrote:Надявам се, че започваш да разбираш за какво говоря. Ако не, ще видя, ако ми остане някакво време да ти го реализирам, но ти препоръчвам да се справиш сам, за да разбереш процеса на работа.
Аз искам сам да си го направя. В крайна сметка целта е да се науча. Нещо не мога да схвана логиката. Значи ако разбирам правилно sheduler-a само следи дали има построена дадената мина. Ако няма не ъпдейтва. На queue-тата работата им е да строят сгради.

Само че тука виждам един проблем. Поправи ме ако греша.
Да кажем стартирам php artisan queue:work но в момента в който затворя конзолата той спира да работи. Така ли е?

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1526
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 162
Location: Parse error: unexpected "}" in /home/index.php on line 26

Post by anonimen » Fri Apr 27, 2018 3:00 pm

Да кажем стартирам php artisan queue:work но в момента в който затворя конзолата той спира да работи. Така ли е?
Да, защото конзолата е parent process на стартираната php команда. Виж как в уиндоус да стартираш background process.

П.п. ето ти: https://superuser.com/questions/198525/ ... background
START /B program

Post Reply