Terug naar hoofdinhoud

Geplande taken in Joomla

15 juni 2026

Elke website heeft klusjes die niemand met de hand wil doen. Oude logbestanden stapelen zich op. Verlopen sessies verstoppen de database. Artikelen blijven vergrendeld omdat een redacteur het browsertabblad heeft gesloten zonder op te slaan. Iemand zou echt eens moeten controleren of er een nieuwe Joomla-versie beschikbaar is. Deze taken zijn saai, repetitief en worden gemakkelijk vergeten, en dat is precies waarom ze automatisch moeten worden uitgevoerd.

Joomla regelt dit met het core component Geplande Taken heet (com_scheduler). Het is de ingebouwde taakplanner van Joomla: je legt een klus een keer vast, geeft hem een tijdregel, en Joomla voert hem keer op keer uit zonder dat je een vinger uitsteekt. Geen externe extensie en geen shell-toegang nodig.

Stel het een keer in en laat Joomla de klusjes doen die je steeds vergeet.

Dit artikel legt uit hoe de Scheduler echt werkt. Het behandelt de basis voor eigenaren en redacteuren, de dagelijkse instellingen en tijdregels voor beheerders, en de taak-plugins, het databaseschema, het vergrendelingsmodel en de PHP-API voor ontwikkelaars. Het doel is om je genoeg vertrouwen in de Scheduler te geven dat je er met een gerust hart je routineonderhoud aan overlaat.

1. De Basis

1.1 Wat Zijn Geplande Taken?

Met de component Geplande Taken (com_scheduler) laat je een stuk werk automatisch draaien volgens een tijdregel. Joomla introduceerde het in versie 4.1 (begin 2022), en sindsdien zit het in de kern. Het vervangt de oude manier waarop je je eigen cron-scripts schreef voor routineonderhoud van Joomla.

Een paar ideeen maken het bijzonder:

  • Elke taak is een rij in een enkele tabel: #__scheduler_tasks.
  • Een taak bevat geen code. Hij verwijst naar een taakroutine die een plugin levert. De plugin doet het echte werk.
  • Timing is data, geen code. Je kiest een regel ("elke 6 uur", "elke nacht om 03:00", of een volledige cron-expressie) en Joomla berekent de volgende uitvoering.
  • Taken kunnen draaien op basis van webverkeer, een echte servercron, de commandoregel, of een beveiligde webcron-URL. Jij kiest.

Kort gezegd: de component is de manager, de plugins zijn de werkers, en de tabel is het lijstje met klusjes.

1.2 Waar Vind Ik Het?

In de Joomla 6-beheeromgeving zijn deze plekken relevant:

Systeem → Beheren → Geplande Taken             (de takenlijst)
Systeem → Beheren → Geplande Taken → Nieuw     (een taak maken)
Systeem → Beheren → Geplande Taken → Opties    (instellingen + ACL)
Systeem → Beheren → Plugins (filter "Taak")     (de taakroutines)

De component staat in administrator/components/com_scheduler/. De taakroutines bestaan als plugins onder plugins/task/. Er is nog een onderdeel: een systeemplugin, Systeem - Schedule Runner (plg_system_schedulerunner), die bezoekers in staat stelt om openstaande taken op de achtergrond te activeren.

1.3 De Drie Onderdelen

Geplande Taken is opgebouwd uit drie delen die samenwerken:

OnderdeelRol
com_scheduler De component. Toont taken, bewerkt tijdregels, laat het laatste resultaat zien en draait de uitvoeringsmotor.
plg_task_* De taak-plugins. Elke plugin biedt een of meer routines aan en doet het echte werk wanneer zijn routine wordt aangeroepen.
plg_system_schedulerunner De systeemplugin die openstaande taken activeert via webverkeer, de webcron-URL of de knop "Testrun" in de beheeromgeving.

Schakel je de taak-plugin uit, dan verdwijnt zijn routine uit de lijst "Nieuwe Taak". Schakel je de Schedule Runner uit, dan stopt het activeren via het web, hoewel een echte servercron dan nog gewoon werkt.

1.4 Een Taak Versus een Routine

Dit onderscheid zorgt bij veel mensen voor verwarring, dus zet het meteen recht:

  • Een routine is een mogelijkheid die een plugin aanbiedt, herkenbaar aan een tekenreeks zoals session.gc of delete.actionlogs. Die is voor elke site hetzelfde.
  • Een taak is jouw ingestelde versie van een routine: een titel, een tijdregel, wat parameters en een status. Je kunt meerdere taken van dezelfde routine maken, bijvoorbeeld twee "Maak een GET-verzoek"-taken die naar twee verschillende URL's wijzen.
Een routine is het recept. Een taak is de maaltijd die je echt hebt ingepland.
Naar boven

2. Je Eerste Taak Maken

2.1 De Stappen

Open Systeem → Beheren → Geplande Taken en klik op Nieuw. Joomla toont je de lijst met beschikbare routines van elke ingeschakelde taak-plugin. Kies er een, bijvoorbeeld Session GC, en je belandt op het bewerkscherm van de taak.

Je vult drie dingen in die ertoe doen:

  1. Titel: een naam die je later herkent, zoals "Verlopen sessies opruimen".
  2. Planning: de tijdregel (behandeld in hoofdstuk 4).
  3. Parameters: opties die bij de routine horen, alleen zichtbaar als de routine die nodig heeft.

Sla de taak op. Joomla berekent meteen het tijdstip next_execution en de taak verschijnt in de lijst, ingeschakeld en wachtend.

2.2 De Takenlijst Lezen

De lijstweergave is je dashboard. Voor elke taak laat hij zien:

KolomBetekenis
Status Ingeschakeld, uitgeschakeld of in de prullenbak.
Taak Jouw titel plus het type routine.
Laatste run / Volgende run Wanneer hij laatst draaide en wanneer hij weer aan de beurt is.
Laatste exitcode Het numerieke resultaat van de laatste run (0 betekent succes).
Aantal keer gedraaid Totaal geslaagde uitvoeringen en mislukkingen.

Elke rij heeft een Testrun-pictogram. Klik erop en Joomla draait die ene taak meteen, op de achtergrond, en ververst de exitcode. Dit is de snelste manier om te bevestigen dat een taak werkt voordat je hem aan een planning toevertrouwt.

2.3 De Laatste Exitcode Is Je Vriend

Na een run vertelt de kolom last_exit_code je wat er gebeurde. Een groene 0 betekent dat de routine netjes klaar is. Elk ander getal wijst op een probleem, en hoofdstuk 6 somt op wat elke code betekent. Maak er een gewoonte van om naar deze kolom te kijken. Een taak die elke nacht stilletjes mislukt is erger dan geen taak, want je gaat ervan uit dat de klus gedaan is.

Naar boven

3. De Standaard Taaktypes

Joomla 6 wordt geleverd met negen taak-plugins. Samen dekken ze de meest voorkomende onderhoudsklusjes. Hier staat wat elke plugin doet en welke routine-id hij levert.

PluginRoutine-idWat hij doet
Check Files (Image Size) checkfiles.imagesize Scant een map op afbeeldingen groter dan een ingestelde limiet en verkleint ze.
Delete Action Logs delete.actionlogs Verwijdert rijen uit de gebruikersactielogboeken die ouder zijn dan een gekozen leeftijd.
Global Check-in plg_task_globalcheckin_task_get Geeft items vrij die door gebruikers vergrendeld ("uitgecheckt") zijn achtergelaten.
Privacy Consent privacy.consent Maakt verlopen privacy-toestemmingen ongeldig en herinnert gebruikers eraan ze te vernieuwen.
Requests (GET-verzoek) plg_task_requests_task_get Stuurt een HTTP GET naar een URL die jij kiest. Ideaal om webhooks te pingen.
Rotate Logs rotation.logs Archiveert en snoeit Joomla-logbestanden zodat ze niet eindeloos groeien.
Session GC session.gc Ruimt verlopen gebruikerssessies op uit de sessie-opslag.
Site Status plg_task_toggle_offline Zet de site online of offline volgens een planning (omschakelen, online zetten, offline zetten).
Update Notification update.notification Mailt superbeheerders zodra er een nieuwe Joomla-kernversie beschikbaar is.

Twee daarvan verdienen een speciale vermelding. Update Notification maakt van Joomla iets dat zijn eigen versie voor je in de gaten houdt, een van de eenvoudigste beveiligingswinsten op elke site. En Requests is de brug naar de buitenwereld: plan een GET naar een webhook en je kunt alles activeren wat een externe dienst aanbiedt, van een Slack-bericht tot het opwarmen van een cache op een CDN.

Naar boven

4. Planningsregels

4.1 De Regeltypes

Elke taak bewaart zijn timing in het veld execution_rules als JSON. Op het bewerkscherm kies je een regeltype en het formulier toont de bijbehorende velden:

RegeltypeJij stelt inVoorbeeld
interval-minutes Een aantal minuten Elke 15 minuten
interval-hours Een aantal uren Elke 6 uur
interval-days Een aantal dagen plus een tijdstip Elke 1 dag om 03:00
interval-months Een aantal maanden, dag en tijdstip Elke 1 maand op dag 1 om 04:00
cron-expression Een volledig cron-patroon 0 3 * * 1 (maandags om 03:00)
manual Niets; geen automatische run Alleen via Testrun of CLI draaien

De intervalregels zijn makkelijk en goed genoeg voor de meeste klusjes. De cron-expressie geeft je de volledige kracht van standaard cron-timing wanneer je precieze controle nodig hebt.

4.2 De Cron-expressie

Achter de schermen gebruikt Joomla een echte cron-parser, dus de vijf-velden-syntaxis die je misschien van Linux kent, werkt precies zoals verwacht:

┌───── minuut        (0 - 59)
│ ┌──── uur           (0 - 23)
│ │ ┌─── dag v.d. maand (1 - 31)
│ │ │ ┌─ maand         (1 - 12)
│ │ │ │ ┌ dag v.d. week  (0 - 6, zondag = 0)
│ │ │ │ │
*  *  *  *  *

Dus */30 * * * * draait elke 30 minuten, 0 2 * * * draait dagelijks om 02:00, en 0 4 1 * * draait om 04:00 op de eerste van elke maand. Wanneer je opslaat, zet Joomla je regel om naar het veld cron_rules en berekent daaruit de volgende uitvoering.

4.3 De Volgende Uitvoering Wordt Berekend, Niet Voor Altijd Opgeslagen

De kolom next_execution is Joomla's plan voor wanneer de taak aan de beurt is. Na elke geslaagde run berekent Joomla die opnieuw aan de hand van de regel. Een manual-taak heeft geen volgend tijdstip, dus zijn next_execution blijft leeg en hij draait nooit vanzelf. Als een taak er ooit "vast in het verleden" uitziet, betekent dat simpelweg dat zijn trigger niet meer heeft afgevuurd sinds het geplande tijdstip aanbrak, wat ons naar het volgende hoofdstuk brengt.

Naar boven

5. Hoe Taken Echt Draaien

Een taak vastleggen zorgt er niet voor dat hij draait. Iets moet de Scheduler wakker maken en vragen "is er iets aan de beurt?". Joomla biedt daar vier manieren voor, en de juiste kiezen is de belangrijkste beslissing die je met deze component maakt.

5.1 De Lazy Scheduler (webverkeer)

Dit is de standaard. Wanneer Lazy Scheduler is ingeschakeld in de Opties, voegt de Schedule Runner-plugin een klein achtergrondverzoek toe aan gewone paginaweergaven. Wanneer een echte bezoeker je site opent en een taak aan de beurt is, activeert de pagina van die bezoeker stilletjes de taak via een AJAX-aanroep (onAjaxRunSchedulerLazy).

Het is handig en vereist geen serverconfiguratie, maar het heeft een zwakte: geen verkeer betekent geen runs. Een rustige site draait om 03:00 zijn nachtelijke taak niet totdat de eerste bezoeker 's ochtends arriveert. De lazy scheduler heeft ook een minimuminterval (standaard 300 seconden), zodat hij niet bij elke paginaweergave afvuurt.

5.2 Een Echte Servercron (aanbevolen)

Voor betrouwbare timing laat je het besturingssysteem het wakker maken doen. Voeg een regel toe aan de crontab van de server die de Joomla-CLI om de paar minuten aanroept:

*/5 * * * * /usr/bin/php /pad/naar/site/cli/joomla.php scheduler:run --all

Nu wordt de Scheduler elke vijf minuten gecontroleerd, ongeacht bezoekers. Dit is de professionele keuze voor elke site waar timing belangrijk is. Zie hoofdstuk 8 voor het volledige commando.

5.3 De Webcron-URL

Als je geen systeemcron kunt toevoegen maar je host (of een externe dienst zoals een monitoringtool) wel een URL volgens een planning kan ophalen, schakel dan Web Cron in de Opties in. Joomla genereert een geheime sleutel en bouwt een URL als deze:

https://example.test/index.php?option=com_ajax&plugin=RunSchedulerWebcron
       &group=system&format=json&hash=JOUW_GEHEIME_SLEUTEL

Wat die URL ook ophaalt, het activeert de openstaande taken (onAjaxRunSchedulerWebcron). Voeg &id=5 toe om alleen taak met id 5 te draaien. De hash houdt vreemden ervan af om jouw taken te activeren, dus behandel hem als een wachtwoord en deel hem nooit in het openbaar.

5.4 De Knop Testrun

Het Testrun-pictogram in de beheerlijst vuurt een enkele taak op verzoek af (onAjaxRunSchedulerTest). Het negeert de planning en is bedoeld om een taak te controleren vlak nadat je hem hebt gemaakt. Gebruik het gerust tijdens het instellen; vertrouw er niet op voor timing in productie.

5.5 Welke Moet Je Gebruiken?

MethodeVereistGeschikt voor
Lazy scheduler Niets, alleen verkeer Kleine sites, makkelijke start
Servercron Toegang tot crontab Productie, betrouwbare timing
Webcron-URL Een externe URL-ophaler Shared hosting zonder cron
Testrun Toegang tot de beheeromgeving Alleen instellen en debuggen

Op een site die je belangrijk vindt, stel je een servercron in en schakel je de lazy scheduler uit. Dat haalt de kleine overhead weg uit de paginaweergaven van je bezoekers en geeft je timing waarop je kunt vertrouwen.

Naar boven

6. Onder de Motorkap

6.1 De Databasetabel

Bijna alles staat in een tabel, #__scheduler_tasks. Een rij is een taak. De kolommen die ertoe doen:

id                automatisch oplopende primaire sleutel
asset_id          koppeling naar de ACL-assets-tabel
title             jouw taaknaam
type              de routine-id, bijv. session.gc
state             1 ingeschakeld, 0 uitgeschakeld, -2 prullenbak
execution_rules   JSON: het regeltype en de waarden
cron_rules        JSON: het verwerkte cron-patroon
last_exit_code    resultaat van de meest recente run
last_execution    wanneer hij laatst draaide
next_execution    wanneer hij volgende keer aan de beurt is (leeg bij manual)
times_executed    teller geslaagde runs
times_failed      teller mislukkingen
locked            tijdstempel terwijl de taak draait (anders leeg)
priority          uitvoeringsprioriteit
params            JSON: instellingen specifiek voor de routine
note              vrije tekst-notitie
ordering          volgorde in de lijst

Doordat de tijdregels JSON zijn, blijft de tabel eenvoudig en bedient hetzelfde schema elk soort taak.

6.2 Het Vergrendelingsmodel

Wat voorkomt dat dezelfde taak twee keer tegelijk draait, bijvoorbeeld wanneer twee bezoekers op hetzelfde moment een pagina laden? Een pseudo-vergrendeling. Voordat een taak draait, schrijft Joomla de huidige tijd in zijn kolom locked. Zolang locked een waarde bevat, pakt geen enkel ander proces de taak op. Wanneer de run klaar is, wist Joomla de vergrendeling en schrijft de resultaten weg.

Als een taak halverwege crasht en zijn vergrendeling nooit wist, redt de globale timeout je (standaard 300 seconden, ingesteld in de Opties). Zodra de vergrendeling ouder is dan de timeout, beschouwt Joomla hem als verlopen en laat de taak opnieuw draaien. Zo herstelt een vastgelopen taak zichzelf.

6.3 Statussen en Exitcodes

De state van een taak is eenvoudig: 1 ingeschakeld, 0 uitgeschakeld, -2 prullenbak. Het resultaat van een run is rijker. Joomla definieert een set statusconstanten in de klasse Status, en de nuttigste zijn:

CodeConstanteBetekenis
0 OK Succesvol gedraaid.
1 RUNNING Is op dit moment bezig.
2 NO_LOCK Kon de vergrendeling niet verkrijgen (draait al).
3 NO_RUN De routine weigerde of slaagde er niet in te draaien.
4 NO_RELEASE Gedraaid, maar kon de vergrendeling niet vrijgeven.
5 KNOCKOUT Een onafgehandelde fout stopte de routine.
123 WILL_RESUME Gepauzeerd; gaat verder bij de volgende trigger.
124 TIMEOUT De timeout overschreden.
125 NO_TASK Geen taakrecord met dat id.
127 NO_ROUTINE De routine (plugin) werd niet gevonden.

De twee die je het vaakst ziet zijn 0 (goed) en 127 (je hebt de plugin die de routine levert uitgeschakeld of verwijderd).

6.4 De Uitvoeringsstroom

Wanneer een trigger afvuurt, is de stroom altijd hetzelfde:

Trigger (web / cron / webcron)
   ↓
Scheduler kiest de eerstvolgende, niet-vergrendelde taak
   ↓
Vergrendeling verkrijgen (tijdstempel "locked" schrijven)
   ↓
Event onExecuteTask versturen met de routine-id
   ↓
De bijbehorende taak-plugin draait zijn routine
   ↓
Exitcode vastleggen, next_execution herberekenen, vergrendeling vrijgeven

De component bevat nooit het werk zelf. Het is puur een dispatcher die de controle via het event onExecuteTask aan een plugin overdraagt.

6.5 De Logs-tabel en de Logs-weergave

De takentabel is maar de helft van het verhaal. Joomla houdt een aparte runhistorie bij in een tweede tabel, #__scheduler_logs, en daar wordt een rij geschreven telkens als een taak draait. De kolommen zijn praktisch:

id          automatisch oplopende primaire sleutel
tasktype    de routine-id die draaide
taskname    de taaktitel ten tijde van de run
taskid      het id van de taak in #__scheduler_tasks
jobid       een job-identifier per run
exitcode    de statuscode uit hoofdstuk 6.3
duration    hoe lang de run duurde, in seconden
lastdate    wanneer deze run plaatsvond
nextdate    het volgende runtijdstip na deze

Je leest deze historie in de beheeromgeving via de knop Logs in de werkbalk van Geplande Taken. De Logs-weergave toont elke run met zijn taaknaam, exitcode en duur, en je kunt op exitcode filteren om alleen de mislukkingen te zien. Een actie Logs wissen leegt de tabel wanneer die te groot wordt; er is geen automatische opschoning, dus op een drukke site wis je hem zelf of plan je een Database cleanup-taak die dat doet.

De kolom duration is degene waar ontwikkelaars op letten. Een taak waarvan de duur in de loop van de tijd oploopt, verwerkt meestal meer data dan voorheen, en dat is het vroege waarschuwingssignaal dat je het werk moet opdelen of de timeout moet verhogen voordat hij de exitcode TIMEOUT raakt.

6.6 Logbestand per Taak en Prioriteit

Twee kleinere instellingen maken het plaatje compleet. Elke taak heeft een veldengroep logging waar je de uitvoer van de routine naar een eigen log_file kunt sturen, wat de berichten van een luidruchtige taak buiten het hoofd-Joomla-logboek houdt. En de kolom priority laat een taak zijn belang aangeven, wat ertoe doet wanneer meerdere taken op hetzelfde moment aan de beurt zijn en Joomla de volgorde bepaalt waarin ze draaien.

Naar boven

7. Je Eigen Taak-plugin Schrijven

7.1 De Vorm van een Taak-plugin

Een taak-plugin is een gewone Joomla-plugin in de groep task. Hij doet drie dingen: hij biedt zijn routines aan, hij draait ze, en hij voegt optioneel formuliervelden voor zijn parameters toe. Joomla geeft je een trait, TaskPluginTrait, die het meeste leidingwerk afhandelt.

Het hart van de plugin is een constante TASKS_MAP die elke routine-id koppelt aan een methode en een taalprefix:

protected const TASKS_MAP = [
    'mycompany.cleanup' => [
        'langConstPrefix' => 'PLG_TASK_MYCLEANUP',
        'method'          => 'doCleanup',
        'form'            => 'cleanupForm',
    ],
];

7.2 Inschrijven op de Events

De plugin schrijft zich in op de events van de Scheduler. onTaskOptionsList zorgt dat de routine in de lijst "Nieuwe Taak" verschijnt; onExecuteTask draait hem:

public static function getSubscribedEvents(): array
{
    return [
        'onTaskOptionsList'    => 'advertiseRoutines',
        'onExecuteTask'        => 'standardRoutineHandler',
        'onContentPrepareForm' => 'enhanceTaskItemForm',
    ];
}

De eerste twee handlers komen rechtstreeks uit TaskPluginTrait. Je schrijft alleen de routinemethode zelf.

7.3 De Routinemethode

Je methode ontvangt het uitvoeringsevent, doet het werk, en geeft een van de statuscodes uit hoofdstuk 6 terug:

protected function doCleanup(ExecuteTaskEvent $event): int
{
    $params = $event->getArgument('params');

    // ... doe hier het echte werk ...

    $this->logTask('Cleanup finished.');

    return Status::OK;   // 0 = succes
}

Geef Status::OK terug wanneer alles goed is, of een andere constante om een probleem te signaleren. Joomla legt de code vast, werkt de tellers bij en herberekent de volgende uitvoering. Dat is het hele contract: inschrijven, aanbieden, draaien, een code teruggeven.

7.4 De Belangrijkste Klassen

KlasseRol
Scheduler Selecteert en draait openstaande taken; de uitvoeringsmotor.
Task Omhult een taakrecord; verkrijgt en geeft de vergrendeling vrij, logt, bewaart de snapshot.
ExecuteTaskEvent Het event dat aan je routine wordt doorgegeven; draagt de taak-id, routine-id en params.
Status De exitcode-constanten.
TaskPluginTrait De hulp-trait die elke kern-taak-plugin gebruikt.

Wil je ooit een uitgewerkt voorbeeld, dan zijn de negen kern-plugins onder plugins/task/ kort, leesbaar en volgen ze precies dit patroon. sessiongc is de eenvoudigste plek om te beginnen.

7.5 Langlopend Werk: Batchverwerking met WILL_RESUME

En een klus die te groot is voor een enkele run, zoals het verkleinen van tienduizend afbeeldingen of het mailen van een nieuwsbrief naar elke abonnee? Draai je hem in een keer, dan raakt hij een PHP-geheugenlimiet of een tijdslimiet, vooral onder de lazy scheduler of een webcron, waar de trigger binnen een gewoon webverzoek leeft.

Joomla lost dit op met een speciale exitcode, Status::WILL_RESUME (123). Het idee is eenvoudig: doe een kleine batch per run, en vertel Joomla dan dat je nog niet klaar bent.

  • Verwerk een behapbaar stuk (zeg 100 records) en geef dan Status::WILL_RESUME terug.
  • Joomla logt de run als geslaagd en laat de taak openstaan, zodat de volgende trigger je routine opnieuw aanroept voor de volgende batch.
  • Wanneer de laatste batch klaar is, geef je Status::OK terug en valt de taak terug op zijn normale planning.

De vorm van een hervatbare routine ziet er zo uit:

protected function doImport(ExecuteTaskEvent $event): int
{
    $offset = (int) $this->getProgress();   // waar de vorige batch stopte

    $batch = $this->fetchRecords($offset, 100);

    foreach ($batch as $record) {
        $this->processOne($record);
    }

    if (\count($batch) < 100) {
        $this->clearProgress();
        return Status::OK;            // laatste batch, we zijn klaar
    }

    $this->saveProgress($offset + 100);
    return Status::WILL_RESUME;       // nog meer te doen, draai me opnieuw
}

Een ding doet het framework niet voor je: het onthoudt niet waar je was. Elke run is een nieuwe aanroep, dus je routine moet zijn eigen voortgang bewaren (een cursor, een offset, of de id's die al verwerkt zijn) tussen batches. Bewaar die ergens duurzaam, zoals in de taakparameters of je eigen tabel, en lees die aan het begin van de volgende run terug.

Houd elke batch ruim binnen de globale timeout uit hoofdstuk 6.2, en houd het werk idempotent zodat een batch die twee keer draait (na een crash, bijvoorbeeld) geen kwaad doet. Geen van de negen kern-taak-plugins heeft dit patroon nodig, maar het is precies hoe je een serieuze import-, export- of bulkmail-taak bovenop de Scheduler bouwt.

Naar boven

8. Commandoregel en Automatisering

8.1 De Console-commando's

De CLI-applicatie van Joomla biedt twee scheduler-commando's. Draai ze vanuit de hoofdmap van de site:

# Toon elke taak met zijn status en volgende run
php cli/joomla.php scheduler:list

# Draai alle taken die nu aan de beurt zijn
php cli/joomla.php scheduler:run --all

# Draai een specifieke taak op id
php cli/joomla.php scheduler:run --id 5

De optie --id (korte vorm -i) heeft voorrang: geef je hem mee, dan wordt --all genegeerd. scheduler:list drukt een nette tabel af met id, titel, type, status en volgende run, handig voor een snelle controle via SSH.

8.2 De Productieopzet

De netste automatisering koppelt een systeemcron aan het CLI-commando. Een crontab-regel stuurt de hele Scheduler aan:

*/5 * * * * /usr/bin/php /pad/naar/site/cli/joomla.php scheduler:run --all >/dev/null 2>&1

Dit draait elke vijf minuten, controleert wat aan de beurt is, en draait het. Elke taak houdt nog steeds zijn eigen planning; de cron bepaalt alleen hoe vaak Joomla kijkt. Een cron van vijf minuten met taken die per uur of per dag gepland staan, is voor de meeste sites de gulden middenweg.

8.3 Waarom CLI Beter Is dan de Lazy Scheduler

Taken vanaf de commandoregel draaien heeft echte voordelen boven runs die door bezoekers worden geactiveerd:

  • Betrouwbare timing: het vuurt af, zelfs als er niemand langskomt.
  • Geen overhead voor bezoekers: paginaweergaven blijven snel omdat ze de trigger niet meer dragen.
  • Geen PHP-webtimeout: lange klussen worden niet afgekapt door de verzoeklimiet van de webserver.
  • Heldere logs: cron-uitvoer en exitcodes zijn makkelijk vast te leggen en te bewaken.

Heb je shell-toegang, dan is dit de manier. Heb je die niet, dan is de webcron-URL uit hoofdstuk 5 het op een na beste.

Naar boven

9. Web Services en Headless

Een veelgestelde vraag: heeft de Scheduler een REST-API onder /api, zoals artikelen of contacten dat hebben? In Joomla 6 is het antwoord nee. De component registreert geen Web Services-route, dus er is geen eindpunt v1/scheduler/tasks om taken via REST aan te maken of op te vragen.

Wat hij in plaats daarvan biedt is het webcron-eindpunt, dat een activeringsmechanisme is in plaats van een data-API. Het draait openstaande taken maar laat je geen taakdefinities lezen of bewerken:

curl "https://example.test/index.php?option=com_ajax&plugin=RunSchedulerWebcron&group=system&format=json&hash=<sleutel>"

Behandel de Scheduler voor de rest als een server-side hulpmiddel. Moet je taken programmatisch beheren, gebruik dan de PHP-klassen Scheduler en Task uit hoofdstuk 7 binnen je eigen code, of stuur de CLI-commando's aan vanuit een deployment-script. Voor het op afstand activeren op een timer richt je een externe monitoringdienst op de webcron-URL.

Naar boven

10. Prestaties en SEO-impact

De Scheduler heeft geen uitvoer aan de voorkant, dus hij verschijnt niet in zoekresultaten en heeft geen eigen metadata. Zijn effect op SEO is indirect maar echt: een goed onderhouden site scoort en presteert beter dan een verwaarloosde.

  • Session GC en Rotate Logs houden de database en schijf slank, wat de reactietijden laag houdt. Snelheid is een rankingsignaal.
  • Update Notification zet je aan om snel te patchen, en een gehackte of beklad site is een SEO-ramp.
  • Requests kan een cache opwarmen of een CDN pingen na een deploy, zodat de eerste echte bezoeker nooit een koude pagina tegenkomt.

Een waarschuwing over het triggermodel zelf. De lazy scheduler voegt een klein achtergrondverzoek toe aan paginaweergaven. Op een drukke site is dat meetbaar. Overstappen op een servercron haalt die kosten in een keer weg bij elke bezoeker, wat de meest directe prestatiewinst is die deze component biedt.

Naar boven

11. Veelgemaakte Fouten en Valkuilen

11.1 "Mijn nachtelijke taak draait nooit"

Symptoom: een taak die voor 03:00 is gepland draait pas uren later, of helemaal niet.

Oplossing: je leunt op de lazy scheduler op een site met weinig verkeer. Geen bezoeker om 03:00 betekent geen trigger. Stel een echte servercron in (hoofdstuk 8) zodat timing niet meer afhangt van verkeer.

11.2 "Laatste exitcode is 127"

Symptoom: de taak mislukt meteen met exitcode 127.

Oplossing: NO_ROUTINE betekent dat Joomla de plugin die de routine levert niet kan vinden. De taak-plugin is waarschijnlijk uitgeschakeld of verwijderd. Schakel hem weer in onder Systeem → Plugins, gefilterd op de groep Taak.

11.3 "Dezelfde taak draaide twee keer"

Symptoom: een klus lijkt twee keer kort na elkaar uitgevoerd te worden.

Oplossing: meestal vuurden twee triggers af voordat de vergrendeling was geschreven, of een servercron en de lazy scheduler zijn allebei actief. Kies een triggermethode en schakel de lazy scheduler uit wanneer je een servercron gebruikt.

11.4 "Een taak is vastgelopen en draait niet meer"

Symptoom: een taak blijft eindeloos als draaiend staan en vuurt nooit meer af.

Oplossing: de run crashte en liet de kolom locked gevuld achter. Wacht tot de timeout (standaard 300 seconden) verloopt en Joomla wist de verlopen vergrendeling zelf. Herstelt hij nooit, verlaag dan de timeout of ontgrendel de taak via de werkbalk van de lijst.

11.5 "Ik deelde mijn webcron-URL en taken vuren willekeurig af"

Symptoom: taken draaien op vreemde tijden nadat de webcron-URL is uitgelekt.

Oplossing: de hash in de URL is een geheim. Genereer de sleutel opnieuw in de Opties om de oude URL ongeldig te maken, en houd de nieuwe geheim.

11.6 "De site ging vanzelf offline"

Symptoom: de site staat onverwacht in de offline-modus.

Oplossing: controleer op een Site Status-taak. Zijn hele taak is de site online of offline te schakelen, en een verkeerd ingestelde planning doet precies dat. Schakel de taak uit of herplan hem.

Naar boven

12. Beste Praktijken

Als je maar een paar dingen uit dit artikel onthoudt, onthou dan deze:

  • Draai op elke site die ertoe doet de Scheduler vanaf een echte servercron en schakel de lazy scheduler uit.
  • Klik altijd op Testrun nadat je een taak hebt gemaakt en bevestig dat de exitcode 0 is.
  • Houd de taak Update Notification ingeschakeld. Het is gratis vroegtijdige waarschuwing voor beveiligingsupdates.
  • Behandel de webcron-hash als een wachtwoord. Genereer hem opnieuw als hij ooit uitlekt.
  • Let op de kolom Laatste exitcode. Een taak die stilletjes mislukt is erger dan geen taak.
  • Geef lange klussen de ruimte: houd de globale timeout verstandig en geef de voorkeur aan de CLI, die niet gebonden is aan verzoeklimieten van het web.
Naar boven

13. In het kort

COMPONENT      Systeem → Beheren → Geplande Taken
NIEUWE TAAK    Geplande Taken → Nieuw (kies een routine)
OPTIES         Geplande Taken → Opties (timeout, lazy, webcron)
TAAK-PLUGINS   Systeem → Plugins (filter "Taak")
RUNNER-PLUGIN  Systeem - Schedule Runner (plg_system_schedulerunner)
HOOFDTABEL     #__scheduler_tasks
LOGS-TABEL     #__scheduler_logs (runhistorie; Logs wissen om te legen)
LOGS-WEERGAVE  Geplande Taken → Logs (filter op exitcode)
REGELTYPES     interval-minutes/-hours/-days/-months, cron-expression, manual
TRIGGERS       lazy scheduler, servercron, webcron-URL, Testrun
CLI RUN        php cli/joomla.php scheduler:run --all
CLI EEN        php cli/joomla.php scheduler:run --id N
CLI LIJST      php cli/joomla.php scheduler:list
WEBCRON-URL    index.php?option=com_ajax&plugin=RunSchedulerWebcron
               &group=system&format=json&hash=SLEUTEL
EXIT 0         OK (succes)
EXIT 124       TIMEOUT          EXIT 127  NO_ROUTINE (plugin ontbreekt)
STATE          1 ingeschakeld, 0 uitgeschakeld, -2 prullenbak
LOCK           tijdstempel "locked"; gewist na timeout (standaard 300s)
SINDS          Joomla 4.1 (2022)
Naar boven

14. Samenvatting

De component Geplande Taken is Joomla's ingebouwde antwoord op "wie gaat eraan denken dit elke dag te doen?". Je legt een taak een keer vast, kiest een tijdregel, kiest hoe hij wordt geactiveerd, en Joomla neemt de klus uit handen.

Voor een paar minuten instellen krijg je:

  • Negen kant-en-klare taakroutines voor logs, sessies, check-ins, afbeeldingsformaten, updates en meer.
  • Flexibele planning, van eenvoudige intervallen tot volledige cron-expressies.
  • Vier triggermethoden, zodat de Scheduler werkt met of zonder shell-toegang.
  • Een veilig vergrendelingsmodel dat dubbele runs voorkomt en vastgelopen taken zelf herstelt.
  • Een nette ontwikkelaars-API om je eigen taakroutines in een enkele kleine plugin toe te voegen.

Het is geen magie. De lazy scheduler hangt af van verkeer, een uitgelekte webcron-hash is een echt risico, en een taak die stilletjes mislukt kan je een vals gevoel van veiligheid geven. Maar gedraaid vanaf een echte servercron, met de exitcodes in de gaten en de taak Update Notification ingeschakeld, doet de Scheduler stilletjes het onderhoud dat een Joomla-site snel, opgeruimd en veilig houdt. Weet je niet zeker of je geplande taken afvuren wanneer ze zouden moeten, of wil je een onderhoudsroutine waar je niet meer aan hoeft te denken, dan loont het om iemand de opzet te laten controleren voordat een vergeten klusje een probleem wordt.

Naar boven
Geplande taken in Joomla
Peter Martin
Peter Martin

Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.