Laravel background jobs

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

Laravel background jobs

Post by teroristd » Wed Apr 25, 2018 6:42 am

Здравейте, възможно ли е да се стартира задача в бекграунд в Ларавел без да се стартира ръчно? Например юзър достъпва някаква страница, натиска бутон и задачата се стартира, да кажем ъпдейтва някакво поле в базата данни през определен период от време.

joTunkiq
Потребител
Потребител
Posts: 825
Joined: Tue Dec 25, 2012 10:03 am
Answers: 142
Contact:

Post by joTunkiq » Wed Apr 25, 2018 6:47 am

Може да го направиш с https://laravel.com/docs/5.6/queues

Въпроса е че трябва да го настроиш през командния прозорец или ssh ако си на vps. На споделен хостинг не става или поне преди време аз като търсих нямаше начин. :?:

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

Post by teroristd » Wed Apr 25, 2018 7:00 am

Четох за това но ако съм разбрал правилно трябва да подам команда в артисан за да стартирам задачата, а аз искам да се стартира без моята намеса.

joTunkiq
Потребител
Потребител
Posts: 825
Joined: Tue Dec 25, 2012 10:03 am
Answers: 142
Contact:

Post by joTunkiq » Wed Apr 25, 2018 7:19 am

Да точно така.

Затова аз ползвам друго. Използвам команди. Но не знам до колко ще ти свърши работа това ако ти трябва да се изпълни точно на клик на бутон от потребител, но все пак .. Те вървят навсякъде и могат да се разграфят както си поискаш. https://laravel.com/docs/5.6/scheduling

Идеята е че работят с cron и трябва да нагласиш един единствен крон който да изпълнява :

Code: Select all

* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1
И вече ти в кода си правиш командите и им казваш колко пъти на ден да се изпълняват или всяка минута или както си поискаш. :) :?:

Пример:
[php]$schedule->command('foo')
->hourly();[/php]


като това се пише в App/Console/Kernel.php, а командите се създават с артисан команда и си ги търсиш в App/Console/Commands/(тук) :idea: :?:

Другия вариант е просто ajax call и така :)

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

Post by teroristd » Wed Apr 25, 2018 7:48 am

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

А какво имаш предвид с ajax call?

joTunkiq
Потребител
Потребител
Posts: 825
Joined: Tue Dec 25, 2012 10:03 am
Answers: 142
Contact:

Post by joTunkiq » Wed Apr 25, 2018 7:56 am

ами както би го напрвил попринцип ако не беше във фреймуорк. При цъкане на бутона js функция прави post заявка до някакъв route и кода ти се изпълнява.

Или разбира се може и без ajax и просто при субмит в контролера да си изпълниш кода. Може би ако кажеш какво точно искаш ще е по-лесно иначе варианти колкото иска - както виждаш. :!: :?:

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

Post by teroristd » Wed Apr 25, 2018 8:06 am

Да ще обясня подробно, но ще е след около един час, че сега ми се налага да изляза.

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

Post by Revelation » Wed Apr 25, 2018 9:26 am

joTunkiq wrote:Може да го направиш с https://laravel.com/docs/5.6/queues

Въпроса е че трябва да го настроиш през командния прозорец или ssh ако си на vps. На споделен хостинг не става или поне преди време аз като търсих нямаше начин. :?:
Не му трябва конзола въобще. Всичко може ръчно да си го направи.
Създава си класа в папка app/Jobs, имплементира нужните зависимости(които са описани в сайта), настройва си какво иска да прави(като насторйки от рода на колко опита да направи, за да се изпълни могат да се опишат чрез публични свойства в класа) и воаля. След това го изпълнява с YouJobClass::dispatch().

@teroristd относно примера ти. Искаш като веднъж натисне бутона, задачата да си се стартира като цяло и през определен период да си ъпдейтва? Без да е нужно второ кликане?

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

Post by teroristd » Wed Apr 25, 2018 12:28 pm

Revelation wrote:@teroristd относно примера ти. Искаш като веднъж натисне бутона, задачата да си се стартира като цяло и през определен период да си ъпдейтва? Без да е нужно второ кликане?
Да.

Но нека обясня по детайлно. Искам да си направя игра, като я правя изцяло с учебна цел. Смятам че така ще ми е по интересно и ще науча различни неща :) . Ще я правя с Laravel и някакви други технологии ако са необходими, като Vue, Angular и т.н. Да минем на това което искам да направя в момента. Нека си представим че някакъв юзър се регистрира. В момента на регистрацията в базата се попълват освен обичайните неща и някаква таблица с ресурси, например жълтици, камъни и желязо. Да кажем в началото има 100 жълтици, 0 камъни и 0 желязо. Първоначалната опция е да построи мина за камъни, за която като се натисне бутон трябва да се стартира таймер, например за 10мин. и като изтече времето да се стартира задачата в бекграунд която да ъпдейтва базата през някакъв интервал например 1мин. и да добавя по 1 камък на играча.

joTunkiq
Потребител
Потребител
Posts: 825
Joined: Tue Dec 25, 2012 10:03 am
Answers: 142
Contact:

Post by joTunkiq » Wed Apr 25, 2018 12:39 pm

Така вече като знаем какво искаш по-лесно ще ти хелпнем. Не че искам да се поватарям, ноо ..
При цъкане на бутона js функция прави post заявка до някакъв route и кода ти се изпълнява.
Или разбира се може и без ajax и просто при субмит в контролера да си изпълниш кода.
По скоро тука проблема е, че не може да си го представиш как ще изглежда в базата данни ми се струва :D

Post Reply