Расписание Команд Laravel Не Работает Должным Образом

#php #laravel #cron

Вопрос:

Я создаю проект с Laravel 7.28 на локальном хостинге. Мне нужно обновлять PDF-файл каждый час. Для начала я создал команду:

 <?php

namespace AppConsoleCommands;

use AppEvent;
use IlluminateConsoleCommand;

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';
    }
}
 

Он просто вставляет запись в таблицу событий и отлично работает. Затем я отредактировал Kernel.php в каталоге AppКонсоль.

 <?php

namespace AppConsole;

use IlluminateConsoleSchedulingSchedule;
use IlluminateFoundationConsoleKernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        CommandsPDF::class,
    ];

    /**
     * Define the application's command schedule.
     *
     * @param IlluminateConsoleSchedulingSchedule $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');
    }
}
 

Наконец, я бегу php artisan schedule:run . Я ожидал, что команда выполняется каждую минуту, но она выполняется только один раз. это проблема на локальном хосте или я сделал что-то не так?

Комментарии:

1. вам нужно что-то вроде cron, чтобы запускать планировщик каждую минуту … «При использовании планировщика вам нужно только добавить следующую запись Cron на свой сервер. «Введение — Запуск планировщика

2. @lagbox возможно ли это на локальном компьютере?

3. вам понадобится что-то вроде «cron» в вашей локальной системе, чтобы каждую минуту вызывать планировщик

Ответ №1:

php artisan schedule:run Просто запускается один раз по своему определению:

Команда schedule:run Artisan оценит все ваши запланированные задачи и определит, нужно ли их выполнять, исходя из текущего времени сервера.

Если вы хотите делать это каждую минуту, вам следует использовать запланированную систему управления процессом, такую как supervisor или crontab или и т. Д. (более подробная информация здесь)

В случае, если вы используете laravel 8.x и работаете на сервере разработки/локальном сервере, вы можете использовать следующую команду, и она будет работать для вас:

 php artisan schedule:work
 

Комментарии:

1. Боюсь php artisan schedule:work , это не сработает. Это не определено. Что еще я могу сделать?

2. @jigsaw075 извините, только что увидел, что вы используете Laravel 7, schelule:work работающий только с версией 8. Для вас, в зависимости от вашей операционной системы, вы должны использовать собственную систему управления процессами по расписанию, как cron и supervisor для базовых систем unix. Для Windows существуют альтернативные решения, которые вы можете найти AlwaysUp .

Ответ №2:

Для Laravel 7 вы также можете использовать приведенную ниже команду для запуска в вашем локальном

 while true; do php artisan schedule:run; sleep 60; done