Laravel background jobs

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

Post by teroristd » Thu Apr 26, 2018 1:18 pm

Да командата си работи.

[php]
<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
'App\Console\Commands\UpdateResources'
];

/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('update:resources')->everyMinute();
}

/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__ . '/Commands');

require base_path('routes/console.php');
}
}
[/php]

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

Post by Revelation » Thu Apr 26, 2018 1:20 pm

Работи като я използваш ръчно от артизана или тръгна като цяло?

Също като извикаш

[php]
php artisan schedule:run
[/php]

ръчно, тръгва ли?

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

Post by teroristd » Thu Apr 26, 2018 1:58 pm

И по двата начина се изпълнява.

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

Post by Revelation » Thu Apr 26, 2018 2:45 pm

Всичко е наред значи?

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

Post by teroristd » Thu Apr 26, 2018 7:09 pm

:D не в смисъл командата работи, но се изпълнява един път. Явно трябва да мисля нещо друго. Имам VMware на лаптопа. Дали ще свърши някаква работа?

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

Post by Revelation » Thu Apr 26, 2018 10:19 pm

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 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: 867
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 62

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.

Post Reply