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

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

WBOY
Freigeben: 2022-05-30 20:51:11
nach vorne
5644 Leute haben es durchsucht

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
Nach dem Login kopieren

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'); //日志输出,默认覆盖先前日志
    }}
Nach dem Login kopieren

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';
Nach dem Login kopieren

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',
        ]);
    }
Nach dem Login kopieren
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']);}
Nach dem Login kopieren

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));
    }
Nach dem Login kopieren

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);
        }
    }
Nach dem Login kopieren

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
    );}
Nach dem Login kopieren
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);
    }
Nach dem Login kopieren

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 &'
        );
    }
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage