Laravel background jobs

Никога не съм настройвал крон на лолания хост, но намерих статия и изглежда че може : 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
 
/dev/null не съществува на windows. Това го оправих но резултата е същия. Изпълнява се само един път.
 
Нещо не си го настроил :)

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

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

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

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

Код:
:loop
    C:\xampp\php\php.exe  C:\xampp\htdocs\Game/artisan schedule:run >> /dev/null 2>&1     
timeout /t 1 
goto loop
Сигурен съм че някой може да излисли доста по-добро решение, просто сега за това се сетих. Може би някой по-запознат с nginx би казал дали там не е по-лесно да се настрои крон. :?:

Абе кофти работа си е да си играеш с крон и xампп под windows :/ Както казах ориентирай се към някой хост. :?:
 
За такива неща се пуска един 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"
 
Изписа ми това съобщение. Също примигва някакво прозорче от време на време, обаче в базата нямам промяна, а трябва да инкрементира.

SUCCESS: The scheduled task "Laravel Scheduler" has successfully been created.

И как да го спра сега?
 
Това прозорче е php.exe прозореца, който се рънва всяка минута от Task Scheduler-a.

Спирането става така:

schtasks /end /tn "Laravel Scheduler"

Колкото до записването. Я да видя командата update:resources, която си направил.
 
Revelation каза:
Колкото до записването. Я да видя командата update:resources, която си направил.

PHP:
<?php

namespace App\Console\Commands;

use App\Resource;
use Illuminate\Console\Command;

class UpdateResources extends Command
{
    protected $signature = 'update:resources';

    protected $description = 'Update resources in database.';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        \DB::table('resources')
            ->where('user_id', 1)
            ->increment('gold', 5);
    }
}
 
А командата регистрира ли е в пропъртито $commands?

Добави Kernel.php:

PHP:
protected $commands = [
      UpdateResources::class
];
 
Да командата си работи.

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:
php artisan schedule:run

ръчно, тръгва ли?
 
:D не в смисъл командата работи, но се изпълнява един път. Явно трябва да мисля нещо друго. Имам VMware на лаптопа. Дали ще свърши някаква работа?
 
teroristd каза:
: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.
 
Revelation каза:
teroristd каза:
: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.

Благодаря, и при мен работи. Сега трябва да се върна към схемата която ми изпрати, и да продължа към следващата част на задачката :) .
 
Горе долу схванах картинката, само не разбрах как да стартирам втората задача при клик от юзъра?
 
Правиш си 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()));
       }
}

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

PHP:
Route::get('/build/{building}', 'BuildingController@build');

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

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

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

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

Горе