Wiederkehrende Aufgaben ohne Cronjob (ADR 073): Sicherung, Statistik kuerzen, geplante Veroeffentlichung, Updatepruefung und Aufraeumen laufen als Plan in der Tabelle scheduled_task - eine Zeile je Aufgabe mit Faelligkeit, Sperre und letztem Ergebnis. Auf geteiltem Hosting gibt es oft keinen Cronjob; der Plan haengt stattdessen an Anfragen und an einem Takt aus dem geoeffneten Backend. Diese Arbeit entstand in einer parallel laufenden Sitzung und lag bis hierher unveroeffentlicht im Arbeitsverzeichnis: die Releases 1.5.0 bis 1.5.5 wurden bewusst aus dem jeweiligen Tag gebaut und enthielten sie deshalb nicht. Vor der Veroeffentlichung geprueft, nicht bloss eingepackt: - phpunit 452/452, npm test 28/28, npm run test:editor vollstaendig. - Die Migration 20260914000100 legt nur die Tabelle scheduled_task an und nimmt sie beim Zurueckrollen wieder weg. Sie fasst keine bestehenden Daten an. - Seit einer Stunde keine Schreibzugriffe der anderen Sitzung mehr. Dabei zwei Fehler behoben: - config/services.yaml verwendet !tagged_iterator. Das ist gueltiges Symfony, aber "lint:yaml config" kennt eigene Tags nur mit --parse-tags und gab 1 zurueck - der CI-Lauf waere daran gescheitert. Flag ergaenzt. - AdminHeadersSubscriber.php (aus 1.5.3) entsprach nicht dem Stil von php-cs-fixer; composer lint gab 8 zurueck. Behoben. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
54 lines
1.1 KiB
PHP
54 lines
1.1 KiB
PHP
<?php
|
|
|
|
namespace App\Tests;
|
|
|
|
use App\Ops\Tasks\Task;
|
|
|
|
/**
|
|
* Eine Aufgabe, die nichts tut außer mitzählen - oder auf Wunsch zu scheitern.
|
|
*
|
|
* Der Plan lässt sich nur dann ehrlich prüfen, wenn die Aufgabe selbst nichts kann: was hier
|
|
* gemessen wird, ist die Mechanik ringsum - Fälligkeit, Sperre, Abstand nach einem Fehlschlag.
|
|
*/
|
|
final class SpyTask implements Task
|
|
{
|
|
public int $runs = 0;
|
|
|
|
public function __construct(
|
|
private string $name,
|
|
private int $interval = 300,
|
|
private ?\Throwable $error = null,
|
|
) {
|
|
}
|
|
|
|
public function name(): string
|
|
{
|
|
return $this->name;
|
|
}
|
|
|
|
public function label(): string
|
|
{
|
|
return 'Testaufgabe '.$this->name;
|
|
}
|
|
|
|
public function explanation(): string
|
|
{
|
|
return 'Nur für Tests.';
|
|
}
|
|
|
|
public function interval(): int
|
|
{
|
|
return $this->interval;
|
|
}
|
|
|
|
public function run(): string
|
|
{
|
|
++$this->runs;
|
|
if (null !== $this->error) {
|
|
throw $this->error;
|
|
}
|
|
|
|
return 'Lauf '.$this->runs;
|
|
}
|
|
}
|