{% extends 'admin/shell.html.twig' %} {% set nav = 'tasks' %} {% block title %}Aufgaben{% endblock %} {% block heading %}Wiederkehrende Aufgaben{% endblock %} {% block lead %}Was regelmäßig laufen soll, wer es anstößt und was zuletzt dabei herauskam. Alle Zeiten in UTC.{% endblock %} {% block content %} {# Der wichtigste Satz zuerst, und zwar als Einschränkung und nicht als Werbung: ohne Anfrage passiert nichts. Wer das nicht weiß, sucht später den Fehler an der falschen Stelle. #}

Wer die Arbeit anstößt

{{ next is null ? 'Zeitpunkt noch unbekannt' : 'Nächster Lauf: ' ~ next|date('Y-m-d H:i:s', 'UTC') ~ ' UTC' }}

Ein Webhosting ohne Cronjob hat nur eines: Anfragen. Deshalb erledigt eine Anfrage die Arbeit – nach der ausgelieferten Antwort, sodass niemand darauf wartet. Ohne Besuch und ohne geöffnete Verwaltung passiert nichts. Eine Aufgabe für 03:00 Uhr läuft dann beim ersten Aufruf danach, auf einer stillen Website vielleicht um 07:15 Uhr. Wer es genauer braucht, richtet einen der beiden unteren Wege ein.

Auslöser in Anfragen

Jeder Seitenaufruf schaut nach, ob etwas fällig ist. Der Normalfall kostet eine gelesene Datei und keine Datenbankabfrage. Ausschalten, wenn ein echter Cronjob die Arbeit übernimmt.

Solange dieser Bildschirm offen und sichtbar ist, fragt er jede Minute nach. So läuft der Plan auch auf einer Website, die gerade niemand besucht.

Der Plan

Abstand in Minuten
{% for task in tasks %} {% else %} {% endfor %}
AufgabeAnAbstandNächster LaufZuletzt
{{ task.label }}

{{ task.explanation }}

{{ task.name }}

{% if not task.enabled %}aus {% elseif task.running %}läuft {% elseif task.due %}fällig {% else %}{{ task.next }}{% endif %} {% if task.status is null %} noch nie {% else %} {{ task.status }}

{{ task.last }} · {{ task.ms }} ms{% if task.trigger %} · durch {{ task.trigger }}{% endif %}

{{ task.message }}

{% if task.failures > 1 %}

{{ task.failures }} Fehlschläge nacheinander – der Abstand bis zum nächsten Versuch wächst.

{% endif %} {% endif %}
{% if task.running %}{% endif %}
Keine Aufgaben. Fehlt die Migration? Der Bildschirm System führt sie aus.
{# Die Formulare der Knöpfe stehen außerhalb der Tabelle: ein Formular im Formular gibt es in HTML nicht, und `form="..."` verbindet Knopf und Formular über die Tabelle hinweg. #} {% for task in tasks %} {% if task.running %} {% endif %} {% endfor %}

Der zuverlässige Weg

falls dieses Hosting ihn anbietet

Beide Wege sind unabhängig von den Schaltern oben – sie laufen auch dann, wenn Besuch und Verwaltung ausgeschaltet sind. Wer einen davon einrichtet, sollte den Besuchs-Auslöser abschalten: die Arbeit ist dann schon getan, und die Website antwortet ein wenig schneller.

URL-Cronjob
{{ cronUrl }}

Diese Adresse beim Hoster als Cronjob eintragen, zum Beispiel alle fünf Minuten. Der Schlüssel ist aus dem Anwendungsgeheimnis abgeleitet, steht in keiner Datenbank und ändert sich, wenn das Geheimnis gewechselt wird. Er gehört nicht in eine E-Mail und nicht in ein Ticket.

Konsole
php bin/console cms:tasks:run

Für einen echten Cronjob, jede Minute. cms:tasks zeigt denselben Plan wie dieser Bildschirm, cms:tasks:run --loop=60 läuft dauerhaft.

Protokoll

die letzten Läufe, neueste zuerst
{% if protocol is empty %}

Noch nichts gelaufen. Steht in der Spalte „Nächster Lauf“ ein Zeitpunkt, ist alles in Ordnung – der Plan wartet.

{% else %}
{% for line in protocol %} {% endfor %}
{{ line }}

Aus var/tasks.log. Die Datei kürzt sich selbst; die Aufgabe „Aufräumen“ tut es ebenfalls.

{% endif %}
{% endblock %}