Heim  >  Artikel  >  PHP-Framework  >  Ausführliche Erläuterung der Verwendung und Prinzipien geplanter Laravel-Aufgaben

Ausführliche Erläuterung der Verwendung und Prinzipien geplanter Laravel-Aufgaben

WBOY
WBOYnach vorne
2022-05-30 11:52:235513Durchsuche

Dieser Artikel vermittelt Ihnen relevantes Wissen über laravel. Er erklärt auch die damit verbundenen Probleme geplanter Aufgaben, die wir hoffentlich gemeinsam betrachten alle.

Ausführliche Erläuterung der Verwendung und Prinzipien geplanter Laravel-Aufgaben

【Verwandte Empfehlungen: Laravel-Video-Tutorial

Anwendungsszenarien

Ein Website-System hat oft viele geplante Aufgaben, die ausgeführt werden müssen. Zum Beispiel Push-Abonnementnachrichten, statistikbezogene Daten usw. Linux verwendet im Allgemeinen Crontab, um geplante Aufgaben einzurichten und zu verwalten. Mit zunehmender Anzahl von Aufgaben wird die Verwaltung geplanter Aufgaben jedoch schwieriger und anfälliger für Verwaltungsverwirrungen. Laravels Lösung für dieses Problem besteht darin, nur eine geplante Aufgabe einzurichten. Alle geplanten Aufgaben im Unternehmen werden anhand dieser geplanten Aufgabe verarbeitet und beurteilt, wodurch die Verwaltung geplanter Aufgaben auf Codeebene realisiert wird. Grundlegende Verwendung Prinzip:

Schedule:Run Diese Spezifikation ist in der VendorilluminateconsoleSchedulingScheduleRunCommand-Klasse definiert. Die Definitionsform ist dieselbe wie bei einer allgemeinen geplanten Aufgabe:

* * * * * php artisan schedule:run >> /dev/null 2>&1

Wenn Laravel Befehle analysiert, wird die ScheduleRunCommand-Klasse mit dem Befehlsarray in der Kernel-Klasse zusammengeführt. :

class Kernel extends ConsoleKernel{
    Protected function schedule(Schedule $schedule)
    {
                //综合数据统计
        $schedule->command('complex_data_log')
        ->everyMinute() //每分钟执行一次(除此之外还有,每五、十、十五、三十...,不同方法设置的默认时间不同)
        ->withoutOverlapping() //防止重复执行
        ->onOneServer() //在单台服务器上跑
        ->runInBackground() //任务后台运行
        //->appendOutputTo('log_path')//日志输出,默认追加
        ->sendOutputTo('log_path'); //日志输出,默认覆盖先前日志
    }}

Der PHP-Artist-Schedule:Run-Befehl ist also ein in das Framework integrierter Befehl.

Wenn der Befehl gestartet wird, findet er standardmäßig die Handle-Methode in der Klasse zur Ausführung:

/**
 * The console command name.
 *
 * @var string
 */protected $name = 'schedule:run';

php Der Befehl „Artisan Schedule: Run“ scannt jede Minute alle in Kernel::schedule registrierten Anweisungen und stellt fest, ob die Anweisung die erreicht hat Ausführungszyklus, wenn er ankommt, schieben Sie ihn in die auszuführende Warteschlange:

	/**
     * Get the commands to add to the application.
     *
     * @return array
     */
    protected function getCommands()
    {
        return array_merge($this->commands, [
            'Illuminate\Console\Scheduling\ScheduleRunCommand',
        ]);
    }
ScheduleRunCommand::handle Funktion:
/** vendor\illuminate\console\Command.php
 * Execute the console command.
 * 
 * @param  \Symfony\Component\Console\Input\InputInterface  $input
 * @param  \Symfony\Component\Console\Output\OutputInterface  $output
 * @return mixed
 */protected function execute(InputInterface $input, OutputInterface $output){
    return $this->laravel->call([$this, 'handle']);}

Aufgabenüberlappung vermeiden:

Manchmal ist die Ausführungszeit einer einzelnen geplanten Aufgabe zu lang nächste Ausführungszeit, die letzte Die Ausführungsaufgabe ist noch nicht abgeschlossen. Zu diesem Zeitpunkt können wir die Methode withoutOverlapping () verwenden, um Aufgabenüberschneidungen zu vermeiden. Sperren Sie in der Methode withoutOverlapping die entsprechende Aufgabe (dasselbe gilt für die Methode onOneServer):

    /**
     * Schedule the event to run every minute.
     * 代码每分钟执行一次
     * @return $this
     */
    public function everyMinute()
    {
        return $this->spliceIntoPosition(1, '*');
    }
    
    /**
     * Splice the given value into the given position of the expression.
     * 拼接定时任务表达式
     * @param  int  $position
     * @param  string  $value
     * @return $this
     */
    protected function spliceIntoPosition($position, $value)
    {
        $segments = explode(' ', $this->expression);

        $segments[$position - 1] = $value;

        return $this->cron(implode(' ', $segments));
    }

Nur wenn Sie die entsprechende Aufgabensperre erhalten, können Sie die Aufgabe ausführen:
/**
     * Execute the console command.
     * 
     * @return void
     */
    public function handle()
    {
        foreach ($this->schedule->dueEvents($this->laravel) as $event) {
            if (! $event->filtersPass($this->laravel)) {
                continue;
            }
            $this->runEvent($event);
        }
    }

Aufgabenhintergrund läuft:

Seit geplanten Aufgaben Wenn sie nacheinander ausgeführt werden, ist die Ausführungszeit der vorherigen Aufgabe zu lang, was sich auf die Ausführungszeit der nächsten Aufgabe auswirkt. Daher können wir die Methode runInBackground verwenden, um die Aufgabe zur Ausführung in den Hintergrund zu stellen, was der Methode etwas ähnlich ist Rolle von & in der Shell:

public function create(Event $event){
    return $this->cache->store($this->store)->add(
        $event->mutexName(), true, $event->expiresAt
    );}
Andere Verwendungen:
Außer In der obigen Methode können wir auch die geplanten Aufgaben von Laravel verwenden, um Shell-Befehle aufzurufen:
/**
     * Run the given event.
     * 运行任务
     * @param  \Illuminate\Contracts\Container\Container  $container
     * @return void
     */
    public function run(Container $container)
    {
        if ($this->withoutOverlapping &&
            ! $this->mutex->create($this)) {
            return;
        }
        
        //判断是否是后台运行
        $this->runInBackground
                    ? $this->runCommandInBackground($container)
                    : $this->runCommandInForeground($container);
    }

Sie können auch Abschlüsse für die Planung verwenden:

/**
     * Build the command for running the event in the background.
     * 构建定时任务后台运行语句
     * @param  \Illuminate\Console\Scheduling\Event  $event
     * @return string
     */
    protected function buildBackgroundCommand(Event $event)
    {
        $output = ProcessUtils::escapeArgument($event->output);

        $redirect = $event->shouldAppendOutput ? ' >> ' : ' > ';

        $finished = Application::formatCommandString('schedule:finish').' "'.$event->mutexName().'"';

        return $this->ensureCorrectUser($event,
            '('.$event->command.$redirect.$output.' 2>&1 '.(windows_os() ? '&' : ';').' '.$finished.') > '
            .ProcessUtils::escapeArgument($event->getDefaultOutput()).' 2>&1 &'
        );
    }

Wenn Sie möchten Um mehr über die Verwendung zu erfahren, können Sie sich die Dokumentation von Laravel ansehen: https://laravelacademy.org/post/19517.html

[Verwandte Empfehlungen:

Laravel-Video-Tutorial

]

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Verwendung und Prinzipien geplanter Laravel-Aufgaben. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen