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

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

Support: 83
Bonus: 178
Мнения: 1768
Мнение 25/04/2018 3:26 pm      Отговорете с цитат


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


Можеш да ги смяташ стойностите, когато ти потрябват.

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

(Щом не правиш игра, която 60 пъти в секунда ъпдейтва)


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

Регистриран на: 25/12/2012 12:03 pm

Support: 142
Bonus: 284
Мнения: 824
Мнение 25/04/2018 4:01 pm      Отговорете с цитат


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

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

Или процентно спрямо времето на започване и приключване може да му добавяш някакви стойности (там колкото % е разликата), но тука трудно би станало без ajax Smile
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
Revelation
Потребител
Потребител

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

Support: 57
Bonus: 114
Мнения: 764
Мнение 25/04/2018 4:56 pm      Отговорете с цитат


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

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

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

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

resources_per_min - измисли си име
SQL code:

user_id
gold
stone
iron


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

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

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

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

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

Support: 83
Bonus: 178
Мнения: 1768
Мнение 25/04/2018 6:03 pm      Отговорете с цитат


Благодаря Revelation. Ако не те притеснява ще се радвам да направиш някоя графика Smile . Също така няма да се разсърдя и на малко код.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Revelation
Потребител
Потребител

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

Support: 57
Bonus: 114
Мнения: 764
Мнение 25/04/2018 7:34 pm      Отговорете с цитат


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

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

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

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

Support: 83
Bonus: 178
Мнения: 1768
Мнение 26/04/2018 11:11 am      Отговорете с цитат


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

PHP code:

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


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

Регистриран на: 25/12/2012 12:03 pm

Support: 142
Bonus: 284
Мнения: 824
Мнение 26/04/2018 11:23 am      Отговорете с цитат


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

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

Цитат:

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

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

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

Support: 83
Bonus: 178
Мнения: 1768
Мнение 26/04/2018 11:30 am      Отговорете с цитат


Добре какъв път трябва да му подам? Реалният път ми е C:\xampp\htdocs\Game
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
joTunkiq
Активен
Активен

Регистриран на: 25/12/2012 12:03 pm

Support: 142
Bonus: 284
Мнения: 824
Мнение 26/04/2018 11:49 am      Отговорете с цитат


Никога не съм настройвал крон на лолания хост, но намерих статия и изглежда че може : https://stackoverflow.com/questions/17442040/setting-up-a-cronjob-in-windows-xampp

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

* * * * * C:\xampp\php\php.exe  C:\xampp\htdocs\Game/artisan schedule:run >> /dev/null 2>&1     
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
teroristd
Редовен
Редовен

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

Support: 83
Bonus: 178
Мнения: 1768
Мнение 26/04/2018 12:04 pm      Отговорете с цитат


/dev/null не съществува на windows. Това го оправих но резултата е същия. Изпълнява се само един път.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
joTunkiq
Активен
Активен

Регистриран на: 25/12/2012 12:03 pm

Support: 142
Bonus: 284
Мнения: 824
Мнение 26/04/2018 12:28 pm      Отговорете с цитат


Нещо не си го настроил Smile

Пробвай на някой хостинг и ще тръгне. Това да нагласяш крон задачи на xампп под windows е ад.

Цитат:
/dev/null не съществува на windows. Това го оправих но резултата е същия. Изпълнява се само един път.
Това е идеята да аутптва към несъществуващ път, защото 99% от времето няма да ти трябва какво аутпутва командата, особено всяка минута Smile

ЕДИТ: гледай за какъв хак се сетих за да емулираш крон ..

правиш един бач файл и го рънваш да си изпълява командата.. Very Happy

:loop
    C:\xampp\php\php.exe  C:\xampp\htdocs\Game/artisan schedule:run >> /dev/null 2>&1     
timeout /t 1
goto loop

Сигурен съм че някой може да излисли доста по-добро решение, просто сега за това се сетих. Може би някой по-запознат с nginx би казал дали там не е по-лесно да се настрои крон. Question

Абе кофти работа си е да си играеш с крон и xампп под windows :/ Както казах ориентирай се към някой хост. Question
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
Revelation
Потребител
Потребител

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

Support: 57
Bonus: 114
Мнения: 764
Мнение 26/04/2018 1:57 pm      Отговорете с цитат


За такива неща се пуска един Docker или Vagrant с линукски сървър и се настройват там нещата.

Иначе под Windows няма cron jobs. Не и това, което е на линукс.

Под Windows може да се пробва следното(не съм го тествал).

1. Добави си php.exe в Environment Variables, за да можеш да викаш в кознолата само "php" вместо целия път.

2. Пробвай следното
Цитат:

schtasks /create /sc minute /mo 1 /tn "Laravel Scheduler" /tr "php C:\xampp\htdocs\Game\artisan schedule:run > NUL"
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Покажи мнения от преди:    
Създайте нова тема   Напишете отговор    web-tourist.net Форуми -> PHP MySQL ASP.NET Часовете са според зоната GMT + 2 Часа
12345678910
Страница 2 от 10


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