Laravel background jobs

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

Post by teroristd » Wed Apr 25, 2018 1:26 pm

anonimen wrote:
Не ми е проблема базата, нито рутовете, за сега Very Happy, ами това че ако играча излезне от играта кода ще спре да се изпълнява. Целта е мината да почне да си трупа ресурси дори играча да не е на линия.
Можеш да ги смяташ стойностите, когато ти потрябват.

Примерно при следващото влизане умножаваш изминалото време по някакъв коефициент и ъпдейтваш. Няма нужда от кронове и такива работи.

(Щом не правиш игра, която 60 пъти в секунда ъпдейтва)
Да виж това е идейно. Не се бях сетил за този начин, обаче тук изниква един проблем. Какво правим ако играча не излезне и не рефрешне през времето което ще е необходимо да се натрупа един камък?

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

Post by joTunkiq » Wed Apr 25, 2018 2:01 pm

Kолегата това ти каза, като сметнеш всичко, ще ъпдейтнеш тогава когато е изминало времето.

Примерно ако трябва да приключи копаенето в 23:59 днес - тогава ще му добавиш всичките изкопани ресурси.

Или процентно спрямо времето на започване и приключване може да му добавяш някакви стойности (там колкото % е разликата), но тука трудно би станало без ajax :)

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

Post by Revelation » Wed Apr 25, 2018 2:56 pm

Объркана ти е логиката.

Нещата не се стартират след като кликнеш някъде.
В такава ситуация си правиш една таблица, където регистрираш всеки потребител, който трябва да участва в "работата"(queue job). Това queue работата му е да взима данните от базата данни и да ъпдейтва ресурсите на записаните потребители.

От там си правиш Schedule примерно на всеки 5 минути да изпълнява този queue job и който се стартира от самото пускане на играта.

Самата таблица трябва да съдържа например:

resources_per_min - измисли си име
[sql]
user_id
gold
stone
iron
[/sql]

Това трябва да съдържа по колко ресурси на 5 минути трябва да се увеличават. Отделно си имай таблица resources да речем, която де факто ще се обновява.

Тази таблица(resources_per_min) трябва да се ъпдейтва от друго queue, което се стартира при кликане бутона за построяване на сграда и му се слага delay, който е времето за построяване на сграда + подаваш user_id да знаеш на кой потребител трябва да обновиш данните.

И след като искаш да учиш Laravel, към всичко това можеш да използваш Broadcasting, за да направиш нещата малко real-time.

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

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

Post by teroristd » Wed Apr 25, 2018 4:03 pm

Благодаря Revelation. Ако не те притеснява ще се радвам да направиш някоя графика :) . Също така няма да се разсърдя и на малко код.

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

Post by Revelation » Wed Apr 25, 2018 5:34 pm

https://drive.google.com/open?id=1W1OEo ... rmUDuxdojA

Не ми е сила да правя диаграми. Надявам се да е по-ясно какво се случва.

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

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

Post by teroristd » Thu Apr 26, 2018 9:11 am

Имам един малък проблем. Когато стартирам php artisan schedule:run се изпълнява само един път, а съм казал да е на всяка минута.

[php]
protected function schedule(Schedule $schedule)
{
$schedule->command('update:resources')->everyMinute();
}
[/php]

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

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

Post by joTunkiq » Thu Apr 26, 2018 9:23 am

Ами да защото изпълняваш командата само 1 път :D

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

Code: Select all

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

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

Post by teroristd » Thu Apr 26, 2018 9:30 am

Добре какъв път трябва да му подам? Реалният път ми е C:\xampp\htdocs\Game

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

Post by joTunkiq » Thu Apr 26, 2018 9:49 am

Никога не съм настройвал крон на лолания хост, но намерих статия и изглежда че може : https://stackoverflow.com/questions/174 ... dows-xampp

В твоя случай крон задачата ще ти е :

Code: Select all

* * * * * C:\xampp\php\php.exe  C:\xampp\htdocs\Game/artisan schedule:run >> /dev/null 2>&1     

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

Post by teroristd » Thu Apr 26, 2018 10:04 am

/dev/null не съществува на windows. Това го оправих но резултата е същия. Изпълнява се само един път.

Post Reply