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>
46 lines
1.7 KiB
JavaScript
46 lines
1.7 KiB
JavaScript
/*
|
|
* Der Takt des geöffneten Backends.
|
|
*
|
|
* Auf einer Website ohne Besucher gibt es keinen Auslöser für wiederkehrende Aufgaben - außer
|
|
* dem Menschen, der gerade in der Verwaltung arbeitet. Dieses Skript klopft in seinem Namen alle
|
|
* 60 Sekunden an; der Server entscheidet, ob überhaupt etwas fällig ist.
|
|
*
|
|
* Drei Eigenschaften, die es unauffällig machen:
|
|
*
|
|
* - Es fragt nur, während der Reiter sichtbar ist. Ein vergessener Hintergrundreiter soll keine
|
|
* Sitzung endlos offen halten und keine Anfragen erzeugen, die niemand sehen will.
|
|
* - Es fragt nie zwei Mal gleichzeitig: eine laufende Anfrage blockiert die nächste.
|
|
* - Ein Fehlschlag ist kein Ereignis. Kein Hinweis, keine Meldung - beim nächsten Takt wieder.
|
|
*/
|
|
(function () {
|
|
var endpoint = document.querySelector('meta[name="kant-tick"]');
|
|
var token = document.querySelector('meta[name="kant-tick-token"]');
|
|
if (!endpoint || !token || !window.fetch) {
|
|
return;
|
|
}
|
|
var busy = false;
|
|
|
|
function tick() {
|
|
if (busy || document.visibilityState !== 'visible') {
|
|
return;
|
|
}
|
|
busy = true;
|
|
var body = new FormData();
|
|
body.append('_csrf_token', token.content);
|
|
fetch(endpoint.content, { method: 'POST', body: body, credentials: 'same-origin' })
|
|
.catch(function () {})
|
|
.then(function () {
|
|
busy = false;
|
|
});
|
|
}
|
|
|
|
// Der erste Takt kommt verzögert: beim Seitenaufbau hat der Browser Wichtigeres zu tun.
|
|
window.setTimeout(tick, 5000);
|
|
window.setInterval(tick, 60000);
|
|
document.addEventListener('visibilitychange', function () {
|
|
if (document.visibilityState === 'visible') {
|
|
tick();
|
|
}
|
|
});
|
|
})();
|