Pri práci s frontami v Laraveli sa mi zvykne stávať, že potrebujem spustiť joby manuálne. Obzvlášť joby bez argumentov, zvyčajne nejaké údržbárske úlohy ako mazanie prebytočných logov alebo generovanie odporúčaní pre používateľa. Tieto joby sú skvelými kandidátmi na plánované spúšťanie, pretože sú abstraktnejšie a väčšinou bezprostredne neovplyvňujú používateľský zážitok. Je to protiklad k jobom, ktoré vykonávajú spracovanie – napríklad keď používateľ nahrá fotku, chce ju vidieť v aplikácii čo najskôr, ideálne bez oneskorenia. Ak sa fotka objaví v aplikácii po 10 minútach, používateľ môže byť dávno preč a nikdy sa nevrátiť.

Vytvorte job #

Základný kód jobu sa dá vygenerovať pomocou artisan:

php artisan make:job RefillFridge

Naplňte triedu jobu RefillFridge požadovanými príkazmi podľa potreby. Pre veľmi rýchle a špinavé testovanie niekedy jednoducho vytvorím closure routy takto:

<?php
use App\Jobs\RefillFridge;

Route::get('refill', function () {
  dispatch(new RefillFridge());
});

Je to lákavé, najmä preto, lebo stačí stlačiť F5 a obnoviť GET route v prehliadači, aby sa job odoslal. Ale routy samozrejme nie sú určené na takéto zneužívanie.

Použite Tinker #

Ďalší spôsob, ako spustiť job bez akéhokoľvek dodatočného kódu, je použiť Tinker.

php artisan tinker --ansi
>>> dispatch(new App\Jobs\RefillFridge)
=> Illuminate\Foundation\Bus\PendingDispatch {#3502}

Pre mnohých to môže stačiť, ale stále vyžaduje trochu písania. Tinker má históriu, ktorou sa dá prehľadávať cez CTRL-R rovnako ako v Bash alebo zsh, ale niekedy sa vymaže a ešte som nepríšiel na to, kedy presne, takže je dobré mať to na pamäti.

Vytvorenie príkazu #

Základný kód príkazu sa dá tiež vygenerovať cez artisan:

php artisan make:command RefillFridge

Teraz odošlite job RefillFridge z príkazu RefillFridge. Je tu drobná záludnosť. Keďže obe triedy sa volajú rovnako, hoci sú v rôznych menných priestoroch, musíme buď použiť absolútne cesty, alebo alias cez kľúčové slovo as. Preferujem metódu s aliasom, pretože znižuje opakovanie a pri pohľade na začiatok súboru je hneď jasné, s čou trieda interaguje. Minimálny kód je nižšie:

<?php
namespace App\Console\Commands;

use App\Jobs\RefillFridge as RefillFridgeJob;
use Illuminate\Console\Command;
use Illuminate\Contracts\Bus\Dispatcher;

class GeneratePlan extends Command {
  protected $signature = 'refill:fridge';
  protected $description = 'Puts fresh food into the fridge';

  public function handle() {
    return app(Dispatcher::class)->dispatch(new RefillFridgeJob());
  }
}

Na rozdiel od predchádzajúcich metód potrebujeme v príkazoch prístup k Dispatcheru aplikácie. Použije sa predvolená fronta a predvolené pripojenie. Príkaz spustíte obvyklým spôsobom:

php artisan refill:fridge

Worker fronty by ho mal o chvíľu prevziať.

Odkazy #