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>
49 lines
1.2 KiB
PHP
49 lines
1.2 KiB
PHP
<?php
|
||
|
||
namespace App\Ops\Tasks;
|
||
|
||
use App\Content\PageRepository;
|
||
|
||
/**
|
||
* Veröffentlicht Seiten, deren geplanter Zeitpunkt vergangen ist.
|
||
*
|
||
* Die Aufgabe mit dem kürzesten Abstand, weil sie die einzige ist, die jemand *bemerkt*: wer eine
|
||
* Seite für Montag 9 Uhr plant, schaut Montag um 9 Uhr nach. Fünf Minuten sind der Kompromiss
|
||
* zwischen „wirkt sofort" und „fällt bei jedem zweiten Seitenaufruf an".
|
||
*/
|
||
final class PublishDueTask implements Task
|
||
{
|
||
public function __construct(private PageRepository $pages)
|
||
{
|
||
}
|
||
|
||
public function name(): string
|
||
{
|
||
return 'publish-due';
|
||
}
|
||
|
||
public function label(): string
|
||
{
|
||
return 'Geplante Veröffentlichungen';
|
||
}
|
||
|
||
public function explanation(): string
|
||
{
|
||
return 'Ohne sie bleibt eine geplante Seite ein Entwurf – die sichere Richtung, aber nicht die gewollte.';
|
||
}
|
||
|
||
public function interval(): int
|
||
{
|
||
return 300;
|
||
}
|
||
|
||
public function run(): string
|
||
{
|
||
$published = $this->pages->publishDue();
|
||
|
||
return [] === $published
|
||
? 'Nichts fällig.'
|
||
: sprintf('%d Seite(n) veröffentlicht: /%s', count($published), implode(', /', $published));
|
||
}
|
||
}
|