createTable('scheduled_task'); // Der technische Name aus dem Code, zum Beispiel `publish-due`. Er ist der Schluessel: // verschwindet eine Aufgabe aus dem Code, verschwindet ihre Zeile beim naechsten Abgleich. $tasks->addColumn('name', 'string', ['length' => 64]); // Der Abstand zwischen zwei Laeufen. Kommt als Vorgabe aus dem Code und ist in der // Verwaltung aenderbar, weil eine taegliche Sicherung auf der einen Installation // richtig und auf der naechsten zu selten ist. $tasks->addColumn('interval_seconds', 'integer', ['default' => 3600]); $tasks->addColumn('enabled', 'boolean', ['default' => true]); // Alle Zeitpunkte in UTC, als Zeichenkette verglichen - wie ueberall sonst im Projekt. $tasks->addColumn('next_run_at', 'datetime_immutable'); $tasks->addColumn('last_run_at', 'datetime_immutable', ['notnull' => false]); // Bis wann diese Aufgabe als "laeuft gerade" gilt. Danach darf sie ein anderer // Durchlauf uebernehmen: ein Prozess, den das Hosting nach 30 Sekunden abgeschossen // hat, kann seine Sperre nicht mehr selbst aufraeumen. $tasks->addColumn('locked_until', 'datetime_immutable', ['notnull' => false]); $tasks->addColumn('last_status', 'string', ['length' => 16, 'notnull' => false]); $tasks->addColumn('last_message', 'string', ['length' => 500, 'default' => '']); $tasks->addColumn('last_duration_ms', 'integer', ['default' => 0]); // Wodurch der letzte Lauf ausgeloest wurde: besuch, verwaltung, cron, konsole, hand. // Steht hier, weil die erste Frage bei einer Stoerung immer dieselbe ist: laeuft der // Ausloeser ueberhaupt, den der Betreiber eingerichtet zu haben glaubt? $tasks->addColumn('last_trigger', 'string', ['length' => 16, 'default' => '']); // Aufeinanderfolgende Fehlschlaege. Sie verlaengern den Abstand bis zum naechsten // Versuch, damit eine Aufgabe, die nicht laufen kann, nicht bei jedem Seitenaufruf // wieder anfaengt. $tasks->addColumn('failures', 'integer', ['default' => 0]); $tasks->setPrimaryKey(['name']); } public function down(Schema $schema): void { // Faellt die Tabelle, faellt nur der Plan: Zeitpunkte und letzte Meldungen. Kein Inhalt, // kein Konto, keine Datei. Beim naechsten Start legt der Abgleich sie neu an. $schema->dropTable('scheduled_task'); } }