Aufgabenplanung
Aufgabenplanung
Einführung
In der Vergangenheit mussten Sie möglicherweise für jede geplante Aufgabe auf dem Server einen neuen Planer erstellen. Cron-Eingang. Dieser Ansatz wird jedoch schnell unfreundlich, da diese Aufgabenplaner nicht im Quellcode enthalten sind und Sie sich jedes Mal über einen SSH-Link beim Server anmelden müssen, um einen Cron-Eintrag hinzuzufügen.
Mit dem Laravel-Befehlszeilenplaner können Sie die Befehlsplanung in Laravel klar und reibungslos definieren. Und wenn Sie diesen Taskplaner verwenden, müssen Sie nur eine einzige Cron-Eintragsschnittstelle auf Ihrem Server erstellen. Ihr Aufgabenplaner wird in der app/Console/Kernel.php
-Methode von schedule
definiert. Um Ihnen den Einstieg zu erleichtern, finden Sie hier ein einfaches Beispiel für diese Methode.
Starten Sie den Planer
Wenn Sie diesen Planer verwenden, müssen Sie nur den folgenden Cron-Eintrag zu Ihrem Server hinzufügen. Wenn Sie nicht wissen, wie Sie einen Cron-Eintrag zum Server hinzufügen, können Sie erwägen, einige Dienste zum Verwalten von Cron-Einträgen zu verwenden, z. B. Laravel Forge:
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
Dieser Cron ist ein Befehl Linie, die Laravel einmal pro Minute ausführt. Wenn der Befehl schedule:run
ausgeführt wird, führt Laravel das geplante Programm gemäß Ihrem Zeitplan aus.
Planung definieren
Sie können alle geplanten Aufgaben in der Methode AppConsoleKernel
der Klasse definieren. Bevor wir beginnen, schauen wir uns ein Beispiel an. In diesem Beispiel planen wir, jeden Tag um Mitternacht eine Schließung auszurufen. Bei einem Abschluss führen wir eine Datenbankabfrage aus, um eine Tabelle zu löschen: schedule
<?php namespace App\Console; use Illuminate\Support\Facades\DB; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; class Kernel extends ConsoleKernel{ /** * 应用里的自定义 Artisan 命令 * * @var array */ protected $commands = [ // ]; /** * 定义计划任务 * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { $schedule->call(function () { DB::table('recent_users')->delete(); })->daily(); } }Zusätzlich zur Verwendung von Abschlüssen zum Definieren der Aufgabenplanung können Sie auch
aufrufbare Objekte verwenden.
$schedule->call(new DeleteRecentUsers)->daily();
Artisan-Befehlsplanung
Zusätzlich zur Planung durch Aufrufen von Abschlüssen können Sie auch Artisan-Befehle und Betriebssystembefehle aufrufen. Sie können beispielsweise einen Artisan-Befehl auslösen, indem Sie den Befehlsnamen oder die Klasse an die Methode command
übergeben.
$schedule->command('emails:send --force')->daily(); $schedule->command(EmailsCommand::class, ['--force'])->daily();
Queue Task Scheduling
job
-Methode kann zum Planen von Warteschlangenaufgaben verwendet werden. Diese Methode bietet eine schnelle Möglichkeit, Aufgaben zu planen, ohne einen Abschluss mithilfe der call
-Methode zum Planen von Aufgaben erstellen zu müssen.
$schedule->job(new Heartbeat)->everyFiveMinutes(); // 分发任务到「heartbeats」队列... $schedule->job(new Heartbeat, 'heartbeats')->everyFiveMinutes();
Shell-Befehlsplanung
exec
Mit Methoden können Befehle an das Betriebssystem gesendet werden:
$schedule->exec('node /home/forge/script.js')->daily();
Einstellungen für die Planungshäufigkeit
Natürlich können Sie Ihren Aufgaben mehrere Planungspläne zuweisen:
Methode | Beschreibung |
---|---|
->cron('* * * * *'); | Benutzerdefinierter Cron Planen Sie Ausführungsaufgaben |
->everyMinute(); | Führen Sie jede Minute Aufgaben aus |
->everyFiveMinutes(); | Alle fünf Minuten eine Aufgabe ausführen |
->everyTenMinutes(); | Alle zehn Minuten eine Aufgabe ausführen |
->everyFifteenMinutes(); | Alle fünfzehn Minuten eine Aufgabe ausführen |
->everyThirtyMinutes(); | Alle dreißig Minuten eine Aufgabe ausführen |
->hourly(); | Führen Sie die Aufgabe stündlich aus |
->hourlyAt(17); | Stündlich Führen Sie alle 17 Minuten eine Aufgabe aus |
->daily(); | Führen Sie jede Mitternacht eine Aufgabe aus (Anmerkung des Übersetzers: jeden Tag um Mitternacht) |
->dailyAt('13:00'); | 13 jeden Tag Klicken Sie, um eine Aufgabe auszuführen |
->twiceDaily(1, 13); | Jeden Tag um 1:00 und 13 Klicken Sie, um die Aufgabe jeweils einmal auszuführen |
->weekly(); | Führen Sie die Aufgabe einmal pro Woche aus |
->weeklyOn(1, '8:00'); | Jeden Montag um 8 Uhr eine Aufgabe ausführen |
->monthly(); | Führen Sie die Aufgabe einmal im Monat aus |
->monthlyOn(4, '15:00'); | 15 am 4. jedes Monats Klicken Sie, um die Aufgabe einmal auszuführen |
->quarterly(); | Um die Aufgabe einmal pro Quartal auszuführen |
->yearly(); | Eine Aufgabe einmal im Jahr ausführen |
->timezone('America/New_York'); | Zeitzone einstellen |
In Kombination mit einigen anderen spezifischen Bedingungen können wir Aufgaben generieren, die zu bestimmten Zeiten in der Woche ausgeführt werden. Führen Sie beispielsweise jeden Montag den Befehl aus:
// 每周一 13:00 执行... $schedule->call(function () { // })->weekly()->mondays()->at('13:00'); // 工作日(周一至周五) 8点 至 17 点每小时执行一次... $schedule->command('foo') ->weekdays() ->hourly() ->timezone('America/Chicago') ->between('8:00', '17:00');
Die Liste der zusätzlichen Einschränkungen lautet wie folgt:
方法 | 描述 |
---|---|
->weekdays(); | 限制任务在工作日执行 |
->weekends(); | 限制任务在周末执行 |
->sundays(); | 限制任务在周日执行 |
->mondays(); | 限制任务在周一执行 |
->tuesdays(); | 限制任务在周二执行 |
->wednesdays(); | 限制任务在周三执行 |
->thursdays(); | 限制任务在周四执行 |
->fridays(); | 限制任务在周五执行 |
->saturdays(); | 限制任务在周六执行 |
->between($start, $end); | 限制任务在 $start 和 $end 之间执行 |
->when(Closure); | 当闭包返回为真时执行 |
->environments($env); | 限制任务在特定环境中执行 |
Zeitbereichsbeschränkung
Verwenden Sie between
, um die Ausführung von Aufgaben auf einen bestimmten Zeitraum des Tages zu beschränken:
$schedule->command('reminders:send') ->hourly() ->between('7:00', '22:00');
oder verwenden Sie unlessBetween
Methode zum Ausschließen eines Zeitraums für eine Aufgabe:
$schedule->command('reminders:send') ->hourly() ->unlessBetween('23:00', '4:00');
Closure Test Limitation
Verwenden Sie die when
-Methode, um eine Aufgabe basierend auf Testergebnissen auszuführen. Mit anderen Worten: Wenn der angegebene Abschluss true
zurückgibt, wird die Aufgabe weiter ausgeführt, solange keine anderen Einschränkungen vorliegen, die die Ausführung der Aufgabe verhindern:
$schedule->command('emails:send')->daily()->when(function () { return true; });
skip
Die Methode kann als angesehen werden when
Der umgekehrte Ablauf der Methode. Wenn die skip
-Methode true
zurückgibt, wird die Aufgabe nicht ausgeführt:
$schedule->command('emails:send')->daily()->skip(function () { return true; });
Wenn Sie die Kette zum Aufrufen der when
-Methode verwenden, wird die Aufgabe nur ausgeführt, wenn alle when
< zurückgeben 🎜> . true
Methoden können zum Ausführen von Aufgaben nur innerhalb einer bestimmten Umgebung verwendet werden: environments
$schedule->command('emails:send') ->daily() ->environments(['staging', 'production']);ZeitzoneVerwenden Sie
Mit der Methode können Sie angeben, dass die Aufgabe innerhalb einer bestimmten Zeitzone ausgeführt wird: timezone
$schedule->command('report:generate') ->timezone('America/New_York') ->at('02:00')Wenn Sie allen geplanten Aufgaben dieselbe Zeitzone zuweisen möchten, können Sie die Methode
im <🎜 definieren > Datei. Diese Methode sollte die Standardzeitzone zurückgeben, die allen geplanten Aufgaben zugewiesen werden soll: app/Console/Kernel.php
/** * 获取默认情况下应为预定事件使用的时区。 * * @return \DateTimeZone|string|null */ protected function scheduleTimezone(){ return 'America/Chicago'; }
scheduleTimezone
{note} Beachten Sie, dass in einigen Zeitzonen die Sommerzeit gilt. Wenn die Sommerzeit umgestellt wird, wird Ihre Aufgabe möglicherweise zweimal oder gar nicht ausgeführt. Daher empfehlen wir, wann immer möglich, die Verwendung von Zeitzonen zur Planung geplanter Aufgaben zu vermeiden. Standardmäßig gilt der Zeitplan, auch wenn die vorherige Aufgabe noch ausgeführt wird will Die Aufgabe wird ebenfalls ausgeführt. Sie können dies mit der Methode
vermeiden:$schedule->command('emails:send')->withoutOverlapping();
withoutOverlapping
Wenn in diesem Beispiel der Befehl Artisan nicht ausgeführt wird, wird er jede Minute ausgeführt. Wenn die Ausführungszeit Ihrer Aufgabe ungewiss ist und Sie die Ausführungszeit der Aufgabe nicht genau einschätzen können, ist die Methode besonders nützlich. emails:send
withoutOverlapping
Bei Bedarf können Sie „ohne Überlappung“ angeben, um den angegebenen Zeitbereich zu sperren. Standardmäßig laufen Sperren nach 24 Stunden ab.
$schedule->command('emails:send')->withoutOverlapping(10);
Die Aufgabe wird nur auf einem Server ausgeführt
{note} Um diese Funktion nutzen zu können, muss der Standard-Cache-Treiber Ihrer Anwendung
memcached
oderredis
sein. Darüber hinaus müssen alle Server über denselben zentralen Cache-Server kommunizieren.
Wenn Ihre Anwendung auf mehreren Servern ausgeführt wird, möchten Sie möglicherweise die Ausführung Ihrer geplanten Aufgaben auf nur einen einzigen Server beschränken. Nehmen wir an, Sie haben einen Zeitplan, der jeden Freitagabend einen neuen Bericht generiert. Wenn der Taskplaner auf drei Servern ausgeführt wird, wird die Aufgabe auf drei Servern ausgeführt und drei Berichte generiert. Das ist nicht gut!
Um anzugeben, dass eine Aufgabe auf einem einzelnen Server ausgeführt werden soll, verwenden Sie beim Definieren einer geplanten Aufgabe die Methode onOneServer
. Der erste Server, der die Aufgabe erhält, generiert eine atomare Sperre, um zu verhindern, dass andere Server gleichzeitig dieselbe Aufgabe ausführen.
$schedule->command('report:generate') ->fridays() ->at('17:00') ->onOneServer();
Hintergrundaufgaben
Standardmäßig werden mehrere gleichzeitig geplante Befehle nacheinander ausgeführt. Wenn Sie lang laufende Befehle haben, kann dies dazu führen, dass nachfolgende Befehle später als erwartet gestartet werden. Wenn Sie daher Befehle gleichzeitig im Hintergrund ausführen möchten, können Sie die runInBackground
-Methode verwenden:
$schedule->command('analytics:report') ->daily() ->runInBackground();
Wartungsmodus
Die Warteschlangenaufgaben von Laravel werden nicht im Wartungsmodus ausgeführt. Weil wir nicht möchten, dass Ihre Planungsaufgaben Projekte beeinträchtigen, die möglicherweise nicht auf Ihrem Server abgeschlossen werden. Wenn Sie jedoch wirklich die Ausführung einer geplanten Aufgabe im Wartungsmodus erzwingen möchten, können Sie die evenInMaintenanceMode
-Methode verwenden:
$schedule->command('emails:send')->evenInMaintenanceMode();
task Ausgabe
Der Laravel-Planer bietet einige praktische Methoden für die Verarbeitung geplanter Aufgabenausgaben. Zunächst können Sie die sendOutputTo
-Methode verwenden, um die Ausgabe zur späteren Überprüfung in eine Datei umzuwandeln:
$schedule->command('emails:send') ->daily() ->sendOutputTo($filePath);
Wenn Sie 附加
in eine bestimmte Datei ausgeben möchten, können Sie die appendOutputTo
-Methode
$schedule->command('emails:send') ->daily() ->appendOutputTo($filePath);
Mit der Methode emailOutputTo
können Sie die Ausgabe an eine angegebene E-Mail-Adresse senden. Bevor Sie E-Mail zum Senden verwenden, müssen Sie den E-Mail-Dienst von Laravel konfigurieren:
$schedule->command('foo') ->daily() ->sendOutputTo($filePath) ->emailOutputTo('foo@example.com');
{note}
emailOutputTo
,sendOutputTo
undappendOutputTo
Methoden gelten nur fürcommand
undexec
.
Aufgaben-Hooks
Verwenden Sie before
und after
Mit dieser Methode können Sie bestimmten Code ausführen, bevor oder nachdem die geplante Aufgabe ausgeführt wird:
$schedule->command('emails:send') ->daily() ->before(function () { // Task is about to start... }) ->after(function () { // Task is complete... });
Ping-URL
Mit den Methoden pingBefore
und thenPing
können Sie die angegebene URL vor oder nach der Ausführung der Aufgabe anpingen. Diese Methode ist besonders nützlich, wenn externe Dienste (wie Laravel Envoyer) benachrichtigt werden:
$schedule->command('emails:send') ->daily() ->pingBefore($url) ->thenPing($url);
true
und pingBeforeIf
können nur verwendet werden, wenn die gegebene Bedingung thenPingIf
Methode ist ping angegebene URL:
$schedule->command('emails:send') ->daily() ->pingBeforeIf($condition, $url) ->thenPingIf($condition, $url);
Alle Ping-Methoden erfordern die Guzzle HTTP-Bibliothek. Sie können Composer verwenden, um Guzzle zu Ihrem Projekt hinzuzufügen:
composer require guzzlehttp/guzzle