I make my first cron in larval.
I use Laravel 9.
I need automated run my application via cron.
I tried it in Laravel using scheduler (use larval good practices).
I have this code:
Command:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
//API pogodowe
use Cmfcmf\OpenWeatherMap;
use Cmfcmf\OpenWeatherMap\Exception as OWMException;
//dostęp do pamięci cache
use Illuminate\Support\Facades\Cache;
//biblioteka narzędzi date/time
use Illuminate\Support\Carbon;
class getWeather extends Command {
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'getWeather:current'; //tak będzie wywoływana komenda z CLI (artisan command)
/**
* The console command description.
*
* @var string
*/
protected $description = 'Pobiera bieżące dane pogodowe.'; //opis komendy
/**
* Create a new command instance.
*
* @return void
*/
public function __construct() {
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle() {
$lang = 'pl';
$units = 'metric';
//tworzymy obiekt OpenWeatherMap z naszym kluczem API
$owm = new OpenWeatherMap(config('constants.OPENWEATHER_API_KEY'));
//czy w cache są poprzednie dane? jeżeli tak, to pobieramy
$pogoda = Cache::has('pogoda') ? Cache::get('pogoda') : array();
// Stan powietrza
$data = @file_get_contents("http://api.gios.gov.pl/pjp-api/rest/aqindex/getIndex/config('constants.ID_STACJI_POMIAROWEJ')"); //pobieramy dane z serera GIOS
if ($data) {
$air = json_decode($data); //poszło OK, dekodujemy do obiektu
} else { //uwaliło się, poinformujmy o tym w logu
$air = null;
echo Carbon::now() . "\t" . 'Bład pobierania danych o stanie powietrza' . PHP_EOL;
}
// Dane pogodowe
try {
$current = $owm->getWeather(config('constants.OPENWEATHER_CITY_ID'), $units, $lang); //pobieramy aktualne dane dla miasta z id=OPENWEATHER_CITY_ID
$forecast = $owm->getDailyWeatherForecast(config('constants.OPENWEATHER_CITY_ID'), $units, $lang, '', 2); //pobieramy prognozę na dwa najbliższe dni dla miasta z id=OPENWEATHER_CITY_ID
} catch (OWMException $e) { //lipa, coś się nie udało
echo Carbon::now() . "\t" . 'OpenWeatherMap exception: ' . $e->getMessage() . ' (Code ' . $e->getCode() . ').' . PHP_EOL;
} catch (Exception $e) { //lipa, ale poważniejsza
echo Carbon::now() . "\t" . 'General exception: ' . $e->getMessage() . ' (Code ' . $e->getCode() . ').' . PHP_EOL;
}
if ($current) { //mamy to! sprawdzamy aktualną pogodę
// Dzisiaj
if (@getimagesize('http:' . $current->weather->getIconURL())) { //sztuczka magiczna - sprawdzam, czy dostarczona nazwa pliku ikony jest powiązana z fizycznym plikiem
$pogoda['today'] = $current; //uff, wszytsko jest ok, zapisujemy w tablicy
}
}
if ($forecast) { //mamy to! sprawdzamy prognozę na jutro
$forecast->rewind(); //ustawiamy na dzisiaj
$forecast->next(); //ustawiamy na kolejnej pozycji (jutro)
$tommorow = $forecast->current(); //pobieramy jutrzejsze dane
// dalej to samo, co powyżej
if (@getimagesize('http:' . $tommorow->weather->getIconURL())) {
$pogoda['tommorow'] = $tommorow;
}
}
// Stan powietrza
if ($air && $air->stIndexLevel->id >= 0) { // ignorujemy dla id<0 - to oznacza brak danych
$pogoda['air'] = $air;
}
// Dane do cache
Cache::forget('pogoda'); //usuwamy poprzednie
Cache::forever('pogoda', $pogoda); //nowe zapisujemy na zawsze
}
}
and app/Console/kernel.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\getWeather', //to nasza nowa komenda
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('getWeather:current') // i od teraz chcemy, żeby
->everyThirtyMinutes() // była uruchamina co 30 minut
->appendOutputTo('/var/log/scheduled_weather.log') //a komunikaty zapisywała w pliku dziennika;
}
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}
I want to run this code in: every Monday, Thursday and Saturday at midnight.
How can I make it work ?
My Answer:
To run the command every Monday, Thursday, and Saturday at midnight, you can modify the `schedule` method in your `Kernel.php` file as follows:
php
protected function schedule(Schedule $schedule)
{
$schedule->command('getWeather:current')
->cron('0 0 * * 1,4,6')
->appendOutputTo('/var/log/scheduled_weather.log');
}
In the `cron` method, the expression `0 0 * * 1,4,6` means:
- `0 0`: At midnight (0 minutes and 0 hours)
- `* *`: Every day of the month and every month
- `1,4,6`: On Monday (1), Thursday (4), and Saturday (6)
This will schedule the `getWeather:current` command to run every Monday, Thursday, and Saturday at midnight.
Rate this post
5 of 5 based on 4054 votesComments