Debug in Joomla
Wanneer een Joomla-pagina een wit scherm toont, een verkeerde vertaling, of simpelweg te traag laadt, is gokken de traagste manier om de oorzaak te vinden. Joomla heeft een ingebouwd hulpmiddel dat gokken verandert in lezen: het laat je elke databasequery zien, elk geladen taalbestand, het gebruikte geheugen, de bestede tijd, en de waarschuwingen die PHP anders verbergt. Het heet Debugmodus, en de motor erachter is de Systeem - Debug-plugin (plg_system_debug).
De meeste beheerders kennen de Debugmodus als een enkele Ja/Nee-schakelaar in de Globale configuratie, en kijken nooit verder. Maar die schakelaar opent een complete diagnostische console onderaan elke pagina, een set opties die bepaalt wat er getoond wordt, en een ontwikkelaars-API om je eigen code te meten. Goed gebruikt is het de snelste manier om te begrijpen wat Joomla bij elk verzoek echt doet.
De schakelaar waarmee Joomla zichzelf uitlegt - elke query, elk bestand, elke milliseconde, onderaan de pagina uitgestald.
Dit artikel legt uit hoe de Debugmodus van Joomla echt werkt. Het behandelt de basis voor eigenaren en redacteuren, de instellingen voor beheerders en de technische details voor ontwikkelaars: waar de schakelaar zit, hoe de plugin de console rendert, wie hem mag zien, en waarom hij nooit aan mag blijven staan op een productiesite.
1. De basis
1.1 Wat is de Debugmodus?
De Debugmodus is een toestand die je inschakelt terwijl je een probleem onderzoekt. Met de modus uit (de normale toestand voor een live site) draait Joomla rustig en toont niets extra's. Met de modus aan verzamelt Joomla gedetailleerde informatie over hoe het de pagina heeft opgebouwd en toont die in een Debug-console - een donkere balk onderaan het scherm, met tabbladen die je kunt openen.
Er zijn twee aparte schakelaars, en ze doen verschillend werk:
- Debug systeem - de hoofdschakelaar. Toont query's, profiling, geheugen, de verzoekgegevens, geladen plugins en PHP-waarschuwingen.
- Debug taal - een smallere schakelaar voor vertalers. Markeert onvertaalde teksten en toont welke taalbestanden zijn geladen.
1.2 De twee onderdelen die het laten werken
De Debugmodus doet alleen iets als twee onderdelen het eens zijn:
- De instelling in de Globale configuratie (
debugendebug_lang), die Joomla vertelt dat je wilt debuggen. - De "Systeem - Debug"-plugin, die de gegevens daadwerkelijk verzamelt en de console tekent.
Staat de instelling aan maar is de plugin uitgeschakeld, dan verschijnt er niets. Is de plugin ingeschakeld maar staat de instelling uit, dan doet de plugin niets. Je hebt beide nodig. Paragraaf 3 legt de plugin in detail uit.
1.3 Waarom het belangrijk is
De Debugmodus beantwoordt de vragen die je van buitenaf niet kunt zien:
- Waarom is deze pagina traag? De tabbladen query en profile tonen het trage deel.
- Waarom is mijn tekst niet vertaald? Het taaltabblad markeert de ontbrekende tekst.
- Waarom ging de pagina stuk? PHP-meldingen en -waarschuwingen, normaal verborgen, worden zichtbaar.
Het verandert "er is iets mis" in "deze query duurt 400 ms" of "deze taalsleutel ontbreekt". Dat is het verschil tussen een probleem oplossen en ernaar gokken.
1.4 Waar je het vindt
De schakelaars staan in de Globale configuratie:
Systeem -> Globale configuratie -> Systeem -> Debug-instellingen
De plugin staat in het pluginbeheer:
Systeem -> Beheren -> Plugins -> zoek "Debug" -> Systeem - Debug
Als beide aan staan en je een frontend- of backendpagina herlaadt, verschijnt de Debug-console onderaan.
Naar boven2. De Debugmodus inschakelen
2.1 Het tabblad Debug-instellingen
Op Systeem → Globale configuratie → Systeem vind je de groep Debug-instellingen met drie velden:
| Veld | Sleutel | Standaard | Wat het doet |
|---|---|---|---|
| Debug systeem | debug |
Nee (0) | Schakelt de hoofd-Debug-console in. |
| Debug taal | debug_lang |
Nee (0) | Markeert vertalingen en toont taalbestanden. |
| Debug taalconstanten | debug_lang_const |
Ja (1) | Toont de constantennaam of de waarde ervan voor onvertaalde teksten. Alleen zichtbaar als Debug taal aan staat. |
Zet Debug systeem op Ja, klik op Opslaan en herlaad een pagina. De console verschijnt - mits de plugin is ingeschakeld en je hem mag zien (paragraaf 6).
2.2 Foutrapportage hoort bij debuggen
De Debugmodus toont PHP-waarschuwingen, maar PHP genereert die alleen als de foutrapportage het toestaat. Het bijbehorende veld zit een tabblad verderop, op Systeem → Globale configuratie → Server:
| Foutrapportage | Effect |
|---|---|
| Systeemstandaard | Laat het over aan de php.ini van de server. |
| Geen | Verbergt alle PHP-meldingen. |
| Eenvoudig | Toont fouten en waarschuwingen, verbergt notices. |
| Maximaal | Toont alles, inclusief notices en deprecation-meldingen. |
Als je een lastig probleem najaagt, zet je Foutrapportage op Maximaal samen met Debug systeem. Je ziet dan elke notice die PHP kan geven. Zet het terug op Systeemstandaard (of Geen) voordat je live gaat, zodat bezoekers nooit een kale PHP-fout zien.
2.3 Wat er gebeurt zodra de Debugmodus aangaat
Het inschakelen van debug verandert meer dan alleen de console. Joomla doet ook het volgende:
- het definieert de constante
JDEBUGals true, die het hele CMS controleert (paragraaf 7); - het start de Profiler van de applicatie, zodat tijdmarkeringen worden vastgelegd;
- het zet GZIP-compressie uit voor het verzoek, zodat de console-HTML niet wordt weggecomprimeerd.
Daarom kan een debugpagina er iets anders uitzien en zich iets anders gedragen dan een normale. De Debugmodus is een diagnostische toestand, geen onzichtbare laag.
Naar boven3. De "Systeem - Debug"-plugin
3.1 De plugin doet het echte werk
De instelling is slechts een vlag. De component die hem leest en de console opbouwt, is de "Systeem - Debug"-plugin, plg_system_debug, in de plugingroep system. Hij wordt met Joomla meegeleverd en staat standaard aan.
De plugin luistert naar verschillende applicatie-events. De twee belangrijkste zijn:
onAfterRespond- wordt geactiveerd nadat Joomla de respons heeft opgebouwd. De plugin verzamelt alle gegevens en injecteert de console net voor</body>.onBeforeCompileHead- voegt de eigen CSS en JavaScript van de console toe aan de head van de pagina.
3.2 Het eerste wat de plugin controleert
Zodra de plugin laadt, controleert hij meteen of debuggen uberhaupt gewenst is:
// Sla de plugin helemaal over als beide schakelaars uit staan
if (!$debugLang && !$app->get('debug')) {
return;
}
Als noch Debug systeem noch Debug taal aan staat, doet de plugin niets en kost hij vrijwel niets. Daarom is het op zichzelf ongevaarlijk om de plugin op een live site ingeschakeld te laten: zonder de instelling draait hij nooit.
3.3 De DebugBar-bibliotheek
De console die je ziet, wordt gerenderd door een bekende PHP-bibliotheek, PHP DebugBar, die met Joomla wordt meegeleverd onder media/vendor/debugbar/. Joomla voedt de bibliotheek met een set datacollectors - een per tabblad - en de bibliotheek tekent de balk en de panelen. Je bewerkt dit niet rechtstreeks; je bestuurt het via de plugin-opties.
4. De Debug-console lezen
Elk tabblad in de console wordt gevuld door een datacollector. Weten wat elk tabblad betekent verandert de balk van ruis in een kaart van het verzoek.
| Tabblad | Collector | Wat het je vertelt |
|---|---|---|
| Info | InfoCollector | Joomla-versie, PHP-versie, de request-id en een opmerking over redactie. |
| User | UserCollector | De huidige gebruiker en zijn groepen. |
| Memory | MemoryCollector | Piekgeheugen dat is gebruikt om de pagina op te bouwen. |
| Request | RequestDataCollector | GET-, POST-, cookie- en sessie-relevante verzoekgegevens. |
| Session | SessionCollector | De inhoud van de sessie-opslag. |
| Profile | ProfileCollector | Tijdmarkeringen van start tot eind, het hart van snelheidsanalyse. |
| Queries | QueryCollector | Elke databasequery, de tijd en hoe vaak hij draaide. |
| Log | MessagesCollector | Logberichten en deprecation-waarschuwingen die dit verzoek zijn verzameld. |
| Taaltabbladen | Language*Collector | Geladen taalbestanden, gebruikte teksten en vertaalfouten. |
4.1 Het tabblad Queries is waar snelheidsproblemen zich verstoppen
Het tabblad Queries telt elke query en toont de duur. Twee patronen verraden in een oogopslag problemen:
- Een hoog totaalaantal (honderden query's op een pagina) betekent meestal dat een extensie binnen een lus query's uitvoert. Dit is het klassieke "N+1"-probleem.
- Een trage query die boven de rest uitsteekt, wijst op een ontbrekende index of een zware join.
Dezelfde query die vele malen wordt herhaald, wordt ook gemarkeerd, wat snel code blootlegt die de database steeds opnieuw om hetzelfde vraagt in plaats van het te cachen.
Als vuistregel draait een normale Joomla-pagina onder de honderd query's; een paar honderd is een teken om te onderzoeken, en enkele honderden betekent vrijwel altijd dat een extensie in een lus zit. Dit zijn geen harde grenzen - een complexe pagina heeft er terecht meer nodig - maar een plotselinge sprong in het aantal is een betrouwbaar waarschuwingssignaal.
4.2 Het tabblad Profile leest als een tijdlijn
Het tabblad Profile toont benoemde markeringen van het begin van het verzoek tot het eind - "afterInitialise", "afterRoute", "afterDispatch", "afterRender" en meer. De tijd tussen twee markeringen vertelt je welke fase traag is. Een grote sprong voor "afterRender" wijst op het template of de modules; een sprong rond "afterDispatch" wijst op de component die het werk doet.
4.3 Query Traces: ontdek wie een query afvuurde
Weten dat een query traag is, is maar het halve antwoord; je moet ook weten welke extensie hem uitvoerde. Schakel de optie Query Traces in (paragraaf 5.1) en elke query in het tabblad Queries krijgt een call stack - de keten van bestanden en methoden die ertoe leidde, bijvoorbeeld een modulehelper die loadObjectList() aanroept. Dit verandert "120 identieke categorie-query's" in "deze module zit in een lus", omdat de trace het verantwoordelijke bestand en de regel benoemt. Het is de snelste manier om een query toe te wijzen aan de extensie die hem bezit.
5. De plugin-opties
De Opties van de plugin (open de plugin en bekijk de tabbladen) bepalen precies wat de console toont. Ze zijn gegroepeerd in drie fieldsets.
5.1 Basis: de belangrijkste panelen
| Optie | Standaard | Bestuurt |
|---|---|---|
| Refresh Assets | Ja | Voegt bij elke herlaadbeurt een verse hash toe aan elk script en stylesheet, zodat de browser nooit een gecacht bestand serveert terwijl je werkt. |
| Allowed Groups | (leeg) | Welke gebruikersgroepen de console mogen zien. Leeg betekent iedereen (zie paragraaf 6). |
| Memory, Request, Session, Profiling, Queries | Tonen | Zet het bijbehorende tabblad aan of uit. |
| Query Traces / Query Profiles / Query Explains | Verbergen | Extra detail per query; alleen getoond als Queries aan staat. |
| Track Request History | Uitgeschakeld | Slaat de gegevens van elk verzoek op schijf op voor latere inspectie (zie paragraaf 11). |
5.2 Query Explains: laat de database zichzelf uitleggen
Met Query Explains aan voert Joomla een EXPLAIN uit op elke select-query (op MySQL en PostgreSQL) en toont het resultaat in het tabblad Queries. Dit laat zien of de database een index gebruikte of de hele tabel doorzocht - de nuttigste aanwijzing wanneer een query traag is. Query Profiles gaat verder op MySQL, met SHOW PROFILE om een query in fasen op te splitsen, maar het vereist dat MySQL-profiling op de server is ingeschakeld.
5.3 Waarom Refresh Assets belangrijk is tijdens ontwikkeling
Normaal voegt Joomla een versie-hash toe aan CSS en JS zodat browsers ze veilig kunnen cachen. Terwijl je de CSS van een template bewerkt, werkt die cache tegen je - de browser houdt het oude bestand vast. Refresh Assets verandert de hash bij elke laadbeurt zodat je altijd je nieuwste wijziging ziet. Het staat standaard aan, juist omdat debuggen meestal het bewerken van frontendbestanden betekent.
Naar boven6. Bepalen wie de Debugmodus ziet
6.1 De optie Allowed Groups
Standaard, als Debug systeem aan staat, ziet iedereen die de site bezoekt de console - inclusief anonieme bezoekers. Dat is prima op een lokale kopie en gevaarlijk op een openbare. De optie Allowed Groups (filter_groups) beperkt de console tot gekozen gebruikersgroepen.
De plugin controleert het zo:
$filterGroups = (array) $this->params->get('filter_groups', []);
if (!empty($filterGroups)) {
$userGroups = $user->groups;
// Toon debug alleen als de gebruiker in een van de toegestane groepen zit
if (!array_intersect($filterGroups, $userGroups)) {
return false; // niet toegestaan - verberg de console
}
}
Zet Allowed Groups op Super Users (of je ontwikkelaarsgroep) zodat normale bezoekers de console nooit zien, zelfs als debug per ongeluk aan blijft staan.
6.2 Gevoelige waarden worden geredigeerd
De console kan verzoek-, sessie- en configuratiegegevens tonen, waarvan sommige gevoelig zijn. De plugin redigeert automatisch sleutels die op geheimen lijken - wachtwoorden, tokens en dergelijke - voordat ze worden getoond. Het zoekpatroon dekt namen als password, passwd, secret, token en smtppass. Dit verkleint het risico, maar het is geen reden om te ontspannen: een console op een openbare site lekt nog steeds de structuur van query's, bestandspaden en versienummers die een aanvaller helpen.
Behandel de Debug-console als interne informatie. Beperk hem tot een vertrouwde groep en schakel de instelling uit zodra je klaar bent.
6.3 Een echt voorbeeld: het Debug-lek van 2022
Dit is geen theoretisch risico. Ik ben hier in 2022 zelf mee geconfronteerd, nadat een van mijn pas gelanceerde Joomla-sites was gehackt. Tijdens mijn onderzoek heb ik mijn bevindingen en analyse gedeeld met het Joomla Security Strike Team, dat de oorzaak van het probleem heeft achterhaald en de oplossing heeft geïmplementeerd die in Joomla 4.2.4 is uitgebracht.
Vóór Joomla 4.2.4 kon de debug-uitvoer gevoelige verzoekgegevens, waaronder de sessie van een ingelogde gebruiker en CSRF-tokens, blootstellen aan mensen die deze niet mochten zien. Een aanvaller die deze tokens leest, kan de sessie kapen en zich voordoen als die gebruiker. Het Joomla-project heeft dit gedocumenteerd als beveiligingsadvies 20221001 (CVE-2022-27912), "Disclosure of critical information in Debug Mode". Het had betrekking op Joomla 4.0.0 tot en met 4.2.3 en werd verholpen in de beveiligingsrelease Joomla 4.2.4.
De oplossing is precies de hierboven beschreven redactie: het patroon PROTECTED_COLLECTOR_KEYS is in 4.2.4 toegevoegd, zodat wachtwoord- en tokenachtige waarden worden gemaskeerd voordat de console ze weergeeft. Het is een duidelijke herinnering dat de veilige toestand niet “geredigeerde debug op een live site” is, maar “debug uitgeschakeld op een live site”.
Ik heb in het Joomla Community Magazine beschreven hoe een van mijn eigen Joomla 4-sites hierdoor werd getroffen en wat ik hiervan heb geleerd: Hoe mijn nieuwe Joomla 4-website werd gehackt.
Naar boven7. Onder de motorkap: JDEBUG en de Query Monitor
7.1 De constante JDEBUG
Het hele CMS draait om een constante. Wanneer Joomla opstart, leest includes/framework.php de instelling en definieert hem:
if (!defined('JDEBUG')) {
define('JDEBUG', $config->debug);
}
Vanaf dat moment kan elke code met een enkele, goedkope controle vragen of debuggen aan staat:
if (JDEBUG) {
// Doe alleen in debugmodus extra diagnostisch werk
}
De core gebruikt dit om de profiler te starten, extra timing bij te houden en dat werk volledig over te slaan als debug uit staat. Je eigen extensie kan dezelfde constante gebruiken om tijdelijke diagnostiek toe te voegen die in productie niets kost.
7.2 Waar de instelling wordt opgeslagen
De twee schakelaars zijn gewone waarden uit de Globale configuratie, dus ze staan in configuration.php in de root van de site, niet in de database:
public $debug = '0'; // Debug systeem
public $debug_lang = '0'; // Debug taal
public $error_reporting = 'default';
Dit is van belang wanneer de backend onbereikbaar is. Als een wijziging je heeft buitengesloten en debug aan blijft staan, kun je dit bestand rechtstreeks bewerken en public $debug = '0'; instellen om de console uit te schakelen zonder in te loggen.
7.3 De Query Monitor
Het tabblad Queries wordt gevoed door een databasemonitor. Als debug aan staat, houdt de databasedriver van Joomla een monitor bij die elke query vastlegt, met de gebonden parameters en hoelang hij duurde. De plugin leest deze monitor aan het eind van het verzoek om het tabblad Queries op te bouwen. Schakel je het paneel Queries uit, dan verwijdert de plugin de monitor volledig, zodat het verzoek niet langer de kosten van het vastleggen van query's betaalt.
7.4 De events waar de plugin naar luistert
| Event | Waarom de plugin het gebruikt |
|---|---|
onAfterRespond |
Alle gegevens verzamelen en de console in de HTML injecteren. |
onBeforeCompileHead |
De CSS en JS van de console toevoegen en eventueel asset-versies wissen. |
onBeforeRespond |
Een Server-Timing-header toevoegen op basis van de profiler-markeringen. |
onAfterDisconnect |
EXPLAIN uitvoeren en query's profilen nadat de database de verbinding verbreekt. |
onAjaxDebug |
Opgeslagen verzoekgeschiedenis serveren via AJAX (paragraaf 11). |
8. Je eigen code profilen
8.1 Je eigen tijdmarkeringen toevoegen
Het tabblad Profile is niet beperkt tot core-markeringen. Elke code kan zijn eigen markeringen toevoegen via de Profiler van de applicatie. Elke markering legt de tijd en het geheugen vast sinds het verzoek begon:
use Joomla\CMS\Profiler\Profiler;
$profiler = Profiler::getInstance('Application');
$profiler->mark('mijnExtensie: voor zwaar werk');
$result = $this->doHeavyWork();
$profiler->mark('mijnExtensie: na zwaar werk');
Beide markeringen verschijnen in het tabblad Profile, en het gat ertussen is precies hoelang je zware werk duurde. Dit is de eenvoudigste manier om een vermoedelijk trage methode te meten zonder externe profiler.
8.2 De Server-Timing-header
Als profiling aan staat, schrijft de plugin de markeringen ook in een standaard Server-Timing-responsheader. De ontwikkelaarstools van je browser (het tabblad Netwerk) tonen dan dezelfde tijden bij het verzoek, zodat je ze kunt lezen zonder de console te openen. De rendertijd van modules en de tijd voor toegangscontroles worden opgeteld in eigen vermeldingen, waardoor een traag template makkelijk op te sporen is.
8.3 Gebruik de constante om dure diagnostiek af te schermen
Als je diagnostiek zelf duur is - een grote array dumpen, een trace opbouwen - wikkel het dan in de constante zodat het nooit in productie draait:
if (JDEBUG) {
Log::add('Payload: ' . print_r($payload, true), Log::DEBUG, 'my-extension');
}
Zo blijft de live site snel terwijl je volledige details krijgt zodra je debug inschakelt.
8.4 Wanneer je Xdebug of een profiler erbij pakt
De Debug-console is een snelle eerste laag: hij vertelt je waar het probleem zit - een trage query, een zware plugin, een trage fase van het verzoek. Om de exacte PHP-regel daarachter te vinden, pak je een step-debugger zoals Xdebug, of een codeprofiler zoals Blackfire of Tideways. De werkwijze is om de Debug van Joomla naar de verdachte component of query te laten wijzen, en daarna het externe hulpmiddel te gebruiken om in te zoomen op de methode die het veroorzaakt. De twee lagen vullen elkaar aan; geen van beide vervangt de ander.
Naar boven9. Logging en deprecation-waarschuwingen
9.1 Het tabblad Log
Met de optie Log aan (de standaard) verzamelt de console berichten die tijdens het verzoek via het logsysteem van Joomla zijn geschreven en toont ze in een tabblad Log, gekleurd op ernst. Hier verschijnen je eigen Log::add()-aanroepen, naast core-meldingen. Het bespaart je het openen van een logbestand om te zien wat er bij een enkele paginalaadbeurt gebeurde.
9.2 Deprecation-waarschuwingen
Joomla waarschuwt wanneer code een oude API gebruikt die in een toekomstige versie wordt verwijderd. Twee instellingen werken samen:
| Instelling | Waar | Effect |
|---|---|---|
| Log Deprecated API | Globale configuratie (log_deprecated) |
Legt deprecation-waarschuwingen uberhaupt vast. |
| Split Deprecated Core API | Plugin-opties (log-deprecated-core) |
Scheidt waarschuwingen veroorzaakt door de Joomla-core van die veroorzaakt door extensies. |
De scheiding is nuttig omdat hij de kernvraag beantwoordt: is de verouderde aanroep de schuld van mijn extensie, of van de core? Waarschuwingen uit /libraries/src worden gegroepeerd als "core", de rest als je eigen code. Los de waarschuwingen in je eigen code op; de core-waarschuwingen worden door Joomla-updates afgehandeld.
9.3 Waarom dit helpt voor een upgrade
Schakel Log Deprecated API in en blader met debug door je site voor een grote Joomla-upgrade. Elke deprecation-waarschuwing is een stuk code dat in de volgende versie kan stoppen met werken. Het nu oplossen, terwijl de oude API nog werkt, is veel makkelijker dan later een kapotte site repareren.
Naar boven10. Taal debuggen
10.1 Wat Debug taal toont
Zet Debug taal op Ja en Joomla markeert vertaalde tekst op de pagina zodat je de staat van elke tekst kunt zien. Onvertaalde teksten springen eruit, en de console krijgt taaltabbladen die het volgende tonen:
- Taalbestanden - elk
.ini-bestand dat Joomla voor deze pagina heeft geladen. - Taalteksten - de sleutels die zijn gebruikt.
- Taalfouten - sleutels zonder vertaling, of bestanden met syntaxfouten.
Dit is de snelste manier om een ontbrekende vertaling te vinden: de foute sleutel verschijnt op de pagina, en het taaltabblad vertelt je welk bestand hem zou moeten bevatten.
10.2 De markeringstekens
Vertaalde teksten worden op het scherm omgeven door markeringstekens. Een tekst met markeringen aan beide kanten is netjes vertaald; een tekst die als zijn ruwe constantennaam wordt getoond (zoals COM_EXAMPLE_HELLO) heeft helemaal geen vertaling. De optie Debug taalconstanten bepaalt of je voor zulke teksten de constantennaam of de terugvalwaarde ziet.
10.3 Lange voorvoegsels afkappen
Joomla-taalsleutels kunnen lang zijn. De taal-fieldset van de plugin-opties laat je een gemeenschappelijk voor- of achtervoegsel van de getoonde sleutel afkappen, en de optie Strip First Word verwijdert het eerste deel (vaak de naam van de extensie). Deze veranderen alleen hoe sleutels worden getoond in de console; ze raken je vertaalbestanden niet aan.
Naar boven11. Debug, AJAX en verzoekgeschiedenis
11.1 Een console per verzoek
De Debug-console toont normaal het verzoek dat de pagina tekende. Maar veel acties gebeuren via AJAX, nadat de pagina is geladen, en die verzoeken hebben geen eigen console. De optie Track Request History lost dit op door de debug-gegevens van elk verzoek op te slaan zodat je ze later kunt openen.
11.2 Hoe het werkt
Met de optie aan schrijft de plugin de verzamelde gegevens van elk verzoek naar een bestand in de cachemap:
cache/plg_system_debug_site/ (of _administrator)
De console biedt dan een "open handler" die een eerder verzoek via AJAX ophaalt (index.php?option=com_ajax&plugin=debug&group=system) en de gegevens ervan toont. Zo kun je de query's en het profiel inspecteren van een AJAX-aanroep op de achtergrond die nooit een zichtbare balk had.
11.3 Een serieuze beveiligingswaarschuwing
Deze functie slaat ruwe verzoekgegevens op, en die gegevens kunnen wachtwoorden en geheime tokens bevatten in bestanden die iedereen met leestoegang tot de cachemap kan openen. De helptekst van Joomla zelf is er duidelijk over: schakel het slechts kort in, en wis na het uitschakelen de cache van de site zodat de opgeslagen bestanden worden verwijderd. Laat Track Request History nooit aan staan.
Naar boven12. Webservices en de opdrachtregel
12.1 JDEBUG bestaat overal
De constante JDEBUG wordt gedefinieerd in elk ingangspunt - de site, de administrator, de API-applicatie en de CLI. Dezelfde instelling debug raakt ze dus allemaal. Op de opdrachtregel meldt de console van Joomla zelfs de debugstatus in de versieregel:
php cli/joomla.php --version
Joomla! 6.x.x (debug: No)
12.2 Geen Debug-console in JSON-responsen
De Debug-console is HTML, geinjecteerd voor </body>. Een webservices-verzoek geeft JSON terug, dat geen body-tag heeft, dus de plugin injecteert geen console in API-responsen - dat zou de JSON beschadigen. In plaats daarvan stapelt de plugin de gegevens intern op in plaats van ze te tonen wanneer er gegevens voor een niet-HTML-respons worden verzameld. In de praktijk betekent dit dat je de REST-API debugt via logs en de query monitor, niet via een zichtbare balk.
12.3 Geen REST-endpoint voor Debug
Er is geen /api/index.php/v1/-route om debuggen aan of uit te zetten. Debug is een configuratie- en diagnosekwestie, geen gegevens om via een API beschikbaar te stellen. Om het vanuit automatisering te wijzigen, bewerk je de instelling via de backend of, in een gecontroleerde deployment, de waarde debug in configuration.php.
12.4 Geen console bij geplande taken of CLI
De Debug-console bestaat alleen voor een HTML-paginaverzoek. De geplande taken en CLI-commando's van Joomla draaien zonder browserrespons, dus er is geen balk om te lezen - zelfs met debug aan. Als je een taak of een opdrachtregelcommando moet diagnosticeren, val je terug op de hulpmiddelen die geen pagina nodig hebben: schrijf naar het log met Log::add(), voeg Profiler::mark()-aanroepen toe om timing te meten, en zorg dat uitzonderingen worden opgevangen en gelogd. Hetzelfde geldt voor elk achtergrondwerk dat nooit HTML rendert.
13. SEO en prestaties
De Debugmodus heeft geen directe SEO-functie, maar hem in de verkeerde toestand laten staan heeft heel reele SEO- en prestatiekosten.
13.1 Debug aan in productie is een prestatiebug
Als debug aan staat, legt Joomla elke query vast, houdt extra profiling-gegevens bij, zet GZIP-compressie uit en plakt verse hashes aan assets zodat de browser ze niet kan cachen. Elk van deze maakt pagina's trager en zwaarder. Een live site met debug aan is meetbaar trager voor elke bezoeker en elke crawler, wat de Core Web Vitals schaadt en, indirect, de ranking.
13.2 De console kan crawlers bereiken
Als Allowed Groups leeg is en debug aan staat, wordt de console toegevoegd aan de HTML die zoekmachines crawlen. Dat is extra opmaak op elke pagina en, erger nog, een informatielek van paden en versies. Door de console tot een vertrouwde groep te beperken, houd je hem volledig uit de openbare pagina.
13.3 Gebruik Debug om prestaties te verbeteren, en zet het dan uit
De juiste manier om de Debugmodus voor SEO te gebruiken is indirect: zet hem aan, lees de tabbladen Queries en Profile, los de trage query of het zware template op, en zet hem uit. De console is een hulpmiddel om snelheidsproblemen te vinden, niet iets dat thuishoort op een live pagina.
Naar boven14. Veelgemaakte fouten en valkuilen
14.1 Debug staat aan maar er verschijnt niets
Symptoom: Je hebt Debug systeem op Ja gezet maar er verschijnt geen console onderaan de pagina.
Oplossing: Controleer de plugin. De "Systeem - Debug"-plugin moet ingeschakeld zijn onder Systeem → Beheren → Plugins. Controleer ook Allowed Groups - staat daar een groep waar je niet in zit, dan is de console voor jou verborgen.
14.2 De console verschijnt op de live site voor iedereen
Symptoom: Bezoekers melden een vreemde donkere balk met technische gegevens onderaan de pagina.
Oplossing: Debug staat aan in productie met Allowed Groups leeg. Zet Debug systeem uit in de Globale configuratie. Stel als vangnet Allowed Groups in op Super Users zodat dit niet opnieuw kan gebeuren.
14.3 De site is traag nadat je iets "repareerde"
Symptoom: De hele site voelt trager aan dan voorheen, zonder duidelijke oorzaak.
Oplossing: Controleer of debug aan bleef staan. De Debugmodus schakelt GZIP en asset-caching uit en legt elke query vast. Zet debug terug op Nee en de snelheid keert terug.
14.4 Een witte pagina zonder fout
Symptoom: Een pagina is leeg en je kunt niet zien waarom.
Oplossing: Zet Debug systeem aan en stel Foutrapportage in op Maximaal. De verborgen PHP-fout die de lege pagina veroorzaakte, verschijnt nu en wijst naar het bestand en de regel.
14.5 Wachtwoorden zichtbaar in het tabblad Request
Symptoom: Je maakt je zorgen dat de console een inlogwachtwoord toont.
Oplossing: De plugin redigeert sleutels die op geheimen lijken, maar het veiligste antwoord is om de console nooit te draaien waar onvertrouwde mensen hem kunnen zien. Beperk Allowed Groups, en schakel Track Request History nooit in behalve voor een korte, begeleide test.
14.6 Vertalingen ogen prima met debug uit maar kapot met debug aan
Symptoom: Tekst toont vreemde markeringstekens eromheen.
Oplossing: Dat is Debug taal die zijn werk doet - de markeringen zijn hoe het de vertaalstaat toont. Zet Debug taal uit en de markeringen verdwijnen; ze worden nooit aan normale bezoekers getoond.
Naar boven15. Best practices
Als je maar een paar dingen uit dit artikel onthoudt, onthoud dan deze:
- Gebruik de Debugmodus om te diagnosticeren, en zet hem daarna uit. Hij hoort nooit lang op een live site te staan.
- Zet Allowed Groups op Super Users (of je ontwikkelaarsgroep) zodat de console nooit aan bezoekers wordt getoond, zelfs niet per ongeluk.
- Combineer Debug systeem met Foutrapportage: Maximaal bij het najagen van een lege pagina of een verborgen waarschuwing.
- Lees het tabblad Queries voor het aantal query's en trage query's; zet Query Explains aan om ontbrekende indexen te zien.
- Gebruik het tabblad Profile en je eigen
Profiler::mark()-aanroepen om de trage fase van een verzoek te vinden. - Zet Log Deprecated API aan voor een grote upgrade en los de waarschuwingen van je extensie op.
- Laat Track Request History nooit aan staan; het kan wachtwoorden op schijf opslaan. Wis de cache na gebruik.
- Houd de "Systeem - Debug"-plugin ingeschakeld - hij is gratis als de instelling uit staat - maar bestuur alles via de schakelaar
debug.
16. In het kort
SYSTEM DEBUG AANZETTEN Systeem -> Globale configuratie -> Systeem -> Debug-instellingen -> Debug systeem = Ja
TAAL DEBUG AANZETTEN zelfde tabblad -> Debug taal = Ja
FOUTRAPPORTAGE Systeem -> Globale configuratie -> Server -> Foutrapportage = Maximaal
DE PLUGIN Systeem -> Beheren -> Plugins -> Systeem - Debug
BEPERK WIE HEM ZIET Systeem - Debug-plugin -> Opties -> Allowed Groups = Super Users
INSTELLINGEN (configuration.php)
debug 0 uit / 1 aan (definieert JDEBUG)
debug_lang 0 uit / 1 aan
error_reporting default / none / simple / maximum
log_deprecated log verouderde API-aanroepen
CONSOLE-TABBLADEN
Info Profile Queries Memory Request Session User Log + taaltabbladen
BELANGRIJKE PLUGIN-OPTIES
filter_groups wie de console mag zien (leeg = iedereen)
queries toon het tabblad Queries
query_traces voeg een call stack toe aan elke query (benoemt de boosdoener)
query_explains voer EXPLAIN uit op select-query's
refresh_assets breek asset-cache bij elke herlaadbeurt
log-deprecated-core splits core- en extensie-deprecations
track_request_history sla verzoeken op schijf op (RISICOVOL - uit)
CODE
Staat debug aan? if (JDEBUG) { ... }
Tijdmarkering Profiler::getInstance('Application')->mark('label')
Afgeschermd log if (JDEBUG) Log::add($msg, Log::DEBUG, 'my-ext')
CLI
Toon debugstatus php cli/joomla.php --version -> (debug: No)
Naar boven17. Samenvatting
De Debugmodus van Joomla is de ingebouwde manier om het CMS te laten uitleggen wat het doet:
- Twee schakelaars in de Globale configuratie - Debug systeem (
debug) en Debug taal (debug_lang) - zetten hem aan. - De "Systeem - Debug"-plugin leest die schakelaars en rendert de Debug-console met een tabblad per datacollector: queries, profile, memory, request, session, log en taal.
- De constante
JDEBUGdraagt de toestand naar elk onderdeel van het CMS, zodat de core en je eigen code alleen bij debuggen extra werk doen. - Allowed Groups houdt de console weg bij bezoekers; gevoelige sleutels worden geredigeerd, maar de console blijft interne informatie.
- Ontwikkelaars profilen hun eigen code met
Profiler::mark(), lezen queryplannen met Query Explains, en bereiden upgrades voor met deprecation-logging. - De Debugmodus schakelt GZIP en asset-caching uit, dus hij vertraagt de site en mag nooit aan blijven staan in productie.
Zodra je de Debugmodus ziet als een diagnostische toestand in plaats van een enkele knop, houdt de console op een muur van getallen te zijn en wordt hij een helder rapport: zoveel query's, zoveel tijd hier, deze tekst onvertaald, deze API verouderd. Als je site traag, leeg of met de verkeerde tekst verschijnt, is debug een paar minuten aanzetten vrijwel altijd de snelste weg naar de echte oorzaak - en weten hoe je leest wat het je vertelt, is een van de vaardigheden die gokken onderscheidt van echte Joomla-probleemoplossing.
Naar boven

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


