Estoy construyendo un proyecto con Laravel 7.28 en localhost. Necesito actualizar un PDF cada hora. Para el principio creé un comando:
<?php namespace App\Console\Commands; use App\Event; use Illuminate\Console\Command; class PDF extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'pdf:update'; /** * The console command description. * * @var string */ protected $description = 'All Country PDFs updated'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return int */ public function handle() { $event = new Event(); $event->user_id = 1; $event->save(); echo 'done'; } }Simplemente inserta un registro en la tabla de eventos y funciona bien. Luego edité Kernel.php en el directorio App\Console.
<?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 = [ Commands\PDF::class, ]; /** * Define the application's command schedule. * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { $schedule->command('pdf:update')->everyMinute(); } /** * Register the commands for the application. * * @return void */ protected function commands() { $this->load(__DIR__ . '/Commands'); require base_path('routes/console.php'); } } Finalmente, ejecuto el php artisan schedule:run . Esperaba que el comando se ejecutara cada minuto, pero solo se ejecuta una vez. ¿Es esto un problema en localhost o hice algo mal?
El php artisan schedule:run solo se ejecuta una vez según su definición:
El comando
schedule:runArtisan evaluará todas sus tareas programadas y determinará si deben ejecutarse en función de la hora actual del servidor.
Si desea hacerlo cada minuto, debe usar un sistema de control de procesos programados como supervisor o crontab , etc. ( más información aquí )
En caso de que esté usando laravel 8.x y se esté ejecutando en un servidor de desarrollo/local, puede usar el siguiente comando y funcionará para usted:
php artisan schedule:workPara Laravel 7 también puede usar el siguiente comando para ejecutar en su local
while true; do php artisan schedule:run; sleep 60; doneEn Windows localhost
En primer lugar, configure el trabajo de programación deseado en el método de ejecución dentro de App\Console\Kernel Más información en la página del sitio web de Laravel aquí
En segundo lugar, en la línea de comando, ejecute el siguiente comando
php artisan schedule:work