Terug naar hoofdinhoud
PHP voor Joomla
Op deze pagina
# Topics

PHP voor Joomla

29 juni 2026

Elke Joomla-site is, achter alle menu’s en modules, in feite een groot PHP-programma. PHP is de programmeertaal waarin Joomla is geschreven en de engine die op je server draait telkens wanneer een bezoeker een pagina opent. Je kunt een Joomla-site jarenlang beheren zonder ook maar één regel PHP te schrijven, maar de PHP-versie die je gebruikt, de manier waarop deze is geconfigureerd en hoe goed deze is geoptimaliseerd, bepalen of je site snel en veilig is of juist traag en kwetsbaar.

In dit artikel wordt PHP uitgelegd vanuit het perspectief van Joomla. Het behandelt de basisbeginselen voor website-eigenaren, de keuzes op het gebied van versies en configuratie voor beheerders, en de manier waarop Joomla zelf PHP gebruikt voor ontwikkelaars, met inbegrip van de runtime, extensies, OPcache, de Factory en dependency injection, foutrapportage, beveiliging en hoe je PHP up-to-date houdt.

Joomla is de applicatie, maar PHP is de motor erachter, die elk verzoek omzet in een pagina.

Het doel is eenvoudig: je PHP goed genoeg laten begrijpen om de juiste versie te kiezen, die correct in te stellen en je Joomla website snel en veilig te houden.

1. De basis

1.1 Wat is PHP?

PHP is een programmeertaal gemaakt voor het web. Hij draait op de server, niet in de browser. Wanneer iemand een Joomla-pagina opent, draait de server PHP-code, praat PHP met de database, bouwt de HTML op en stuurt die afgewerkte HTML terug naar de browser. De bezoeker ziet de PHP zelf nooit, alleen het resultaat.

De naam is een grapje dat naar zichzelf verwijst: het staat voor "PHP: Hypertext Preprocessor". Voor een Joomla-site is het belangrijke punt dat PHP de laag is tussen de webserver en de database, en dat Joomla een grote PHP-applicatie is die in die laag leeft.

1.2 Waarom Joomla PHP nodig heeft

Een Joomla-pagina is geen bestand dat op schijf klaarstaat. Joomla bouwt hem bij elke aanvraag opnieuw op: het leest het menu, laadt het artikel, draait de plugins, rendert het template en stelt de pagina samen. Al dat werk is PHP. Zonder PHP zijn de bestanden in je public_html-map gewoon tekst; PHP is wat ze tot leven brengt.

1.3 Waar PHP in de stack zit

PHP is de middelste laag in de klassieke keten die elke Joomla-pagina serveert:

Browser
   ↓
Webserver (Apache / Nginx / LiteSpeed)
   ↓
PHP (draait Joomla's index.php)
   ↓
Database (MySQL of MariaDB)
   ↓
HTML terug naar de browser

De webserver bepaalt hoe de aanvraag binnenkomt; PHP bepaalt wat Joomla ermee doet. Dit artikel richt zich op die PHP-laag.

Naar boven

2. PHP-versies en Joomla 6

2.1 De minimumversie

Elke Joomla-release stelt een minimale PHP-versie in. Joomla 6 vereist PHP 8.3.0 of nieuwer. De controle is het allereerste wat draait: Joomla's index.php definieert een constante en weigert te starten op een oudere versie.

define('JOOMLA_MINIMUM_PHP', '8.3.0');

if (version_compare(PHP_VERSION, JOOMLA_MINIMUM_PHP, '<')) {
    // toon een vriendelijke "incompatibele PHP"-pagina en stop
}

Als je host nog PHP 8.1 of 8.2 draait, zal Joomla 6 niet installeren of bijwerken totdat je eerst de PHP-versie verhoogt.

2.2 Waarom nieuwer beter is

PHP-versies zijn niet zomaar nummers. Elke hoofdtak is sneller en veiliger dan de vorige, en een oude versie krijgt op een gegeven moment geen beveiligingsupdates meer:

PHP-takStatus voor Joomla 6
8.2 en ouder Te oud; Joomla 6 draait er niet op.
8.3 De minimaal ondersteunde versie.
8.4 Ondersteund en aanbevolen waar je extensies dat toelaten.

Nieuwere PHP is meestal sneller en gebruikt minder geheugen voor hetzelfde werk, dus PHP bijwerken is een van de goedkoopste snelheidswinsten die je kunt halen, vaak zonder enige wijziging aan Joomla.

2.3 Wat nieuwere PHP-versies toevoegden

Elke PHP-release voegt ook taalfuncties toe waarmee Joomla en zijn extensies schonere, veiligere code kunnen schrijven. Je hoeft deze niet te kennen om een site te draaien, maar ze verklaren waarom moderne Joomla-code eruitziet zoals hij eruitziet en waarom hij een recente PHP-versie nodig heeft:

VersieBelangrijke toevoegingen
PHP 7.4 Typed properties, arrow functions.
PHP 8.0 Named arguments, attributes, constructor property promotion, union types, the JIT compiler.
PHP 8.1 Enums, readonly properties, Fibers, pure intersection types.
PHP 8.2 Readonly classes, standalone null, true, and false types.
PHP 8.3 Typed class constants, further optimisations and refinements.

Joomla 6 gebruikt functies uit deze versies door de hele code heen, wat een van de redenen is dat het minimum op PHP 8.3 ligt en niet iets ouders.

2.4 Einde levensduur

Elke PHP-versie bereikt na een paar jaar het "einde van de levensduur" en krijgt dan geen beveiligingspatches meer. Een PHP-versie draaien waarvan de levensduur is verlopen is een echt risico, ook al laadt de site nog. Controleer de officiele PHP-ondersteuningstijdlijn en plan om van een tak af te stappen voordat die verloopt, niet erna: php.net/supported-versions.php

2.5 Waar je je versie controleert

Je hebt geen shell-toegang nodig om je PHP-versie te zien. Open in Joomla Systeem → Systeeminformatie → PHP-informatie. Dit is de volledige uitvoer van PHP's phpinfo(), met de versie, de geladen extensies en elke actieve instelling. Het is de eerste plek om te kijken wanneer iets zich anders gedraagt tussen twee servers.

Naar boven

3. configuration.php: PHP als configuratie

3.1 Een PHP-bestand, geen instellingenscherm

Joomla bewaart zijn instellingen in een enkel PHP-bestand in de hoofdmap van de site, configuration.php. De instellingen die je wijzigt in Systeem → Algemene configuratie worden teruggeschreven naar dit bestand. Het is gewone PHP: een class met een property per instelling.

<?php
class JConfig {
    public $sitename = 'My Joomla Site';
    public $editor = 'tinymce';
    public $error_reporting = 'default';
    public $gzip = false;
    public $tmp_path = '/path/to/site/tmp';
    public $log_path = '/path/to/site/administrator/logs';
    // ...nog veel meer...
}

3.2 Waarom dit belangrijk is

Omdat het PHP is, breekt een enkele typefout in configuration.php (een ontbrekende puntkomma, een verdwaald aanhalingsteken) de hele site met een blanco pagina of een parse error. Bewerk het zorgvuldig, houd altijd een back-up voordat je het met de hand wijzigt, en laat nooit een kopie genaamd configuration.php.bak in de webroot staan, want die kopie kan als platte tekst worden gedownload en hij bevat je databasewachtwoord.

3.3 Het databasewachtwoord staat hier

Dit bestand bevat de databasehost, de gebruiker en het wachtwoord in leesbare PHP. Daarom is het beschermen ervan zo belangrijk: iedereen die configuration.php kan lezen, kan je databasegegevens lezen. Houd de bestandsrechten strak (vaak 444 of 644) en zorg dat de webserver het niet als download kan serveren.

Naar boven

4. Hoe Joomla PHP draait

4.1 Een enkel toegangspunt

Joomla gebruikt een front controller-patroon. Bijna elke front-end-aanvraag draait hetzelfde bestand, index.php in de hoofdmap van de site, en de back-end draait administrator/index.php. De webserver stuurt de aanvraag daarheen, en dat ene bestand start de hele applicatie op.

4.2 De _JEXEC-bewaker

Open vrijwel elk PHP-bestand binnen Joomla en de eerste echte regel is een bewaker:

defined('_JEXEC') or die;

De hoofd-index.php definieert de constante _JEXEC voordat hij iets anders laadt. Elk ander PHP-bestand controleert of die constante bestaat. Als iemand probeert een diep bestand rechtstreeks in de browser op te roepen, is de constante niet gezet en stopt het bestand in plaats van buiten zijn context te draaien. Het is een eenvoudig maar belangrijk beveiligingspatroon, en je ziet het bovenaan elk Joomla PHP-bestand dat je opent.

4.3 De opstartvolgorde in het kort

Van buitenaf lijkt het ogenblikkelijk, maar elke pagina doorloopt dezelfde stappen:

1. index.php controleert de PHP-versie
2. definieert _JEXEC en de pad-constanten
3. laadt de autoloader en het framework
4. bouwt de applicatie op vanuit de DI-container
5. de applicatie routeert de aanvraag en rendert de pagina

Je komt deze stappen zelden tegen, maar weten dat ze bestaan verklaart waarom het bewerken van core bestanden zo gevaarlijk is: je zou de motor bewerken terwijl hij draait.

Naar boven

5. PHP-extensies die Joomla nodig heeft

5.1 Wat een extensie is (in PHP-termen)

PHP zelf is klein. De meeste echte kracht komt uit extensies: optionele modules die in PHP zijn gecompileerd en die functies toevoegen zoals afbeeldingsverwerking of databasetoegang. Dit zijn PHP-extensies, geen Joomla-extensies; verwar de twee niet. Joomla heeft er een set van nodig om volledig te werken.

5.2 Vereiste en aanbevolen extensies

ExtensieWaarvoor Joomla het gebruikt
mysqli of pdo_mysql Praten met de MySQL- of MariaDB-database.
json JSON lezen en schrijven; overal gebruikt, ook in de API.
gd of imagick Afbeeldingen schalen en converteren in het Mediabeheer.
intl Taal-, datum- en getalopmaak voor meertalige sites.
mbstring Multibyte-tekst (UTF-8) correct verwerken.
zip Extensies installeren en bijwerken vanuit ZIP-pakketten.
curl Uitgaande HTTP-aanvragen doen, voor updates en externe diensten.
xml / simplexml Manifestbestanden en feeds lezen.
openssl Versleuteling, veilige tokens en HTTPS-verbindingen.

5.3 Hoe je ziet wat je hebt

Open Systeem → Systeeminformatie en bekijk de tabbladen PHP-informatie en Directives. De pagina PHP-informatie toont elke geladen extensie. Als het schalen van afbeeldingen mislukt of een extensie niet wil installeren, is een ontbrekende PHP-extensie een veelvoorkomende oorzaak, en dit is waar je het bevestigt.

Naar boven

6. De php.ini-instellingen die ertoe doen

6.1 Waar de instellingen staan

PHP leest zijn gedrag uit een configuratiebestand genaamd php.ini. Op shared hosting wijzig je vaak een deel hiervan via een controlepaneel, een .user.ini-bestand of een PHP-versiekiezer. De waarden hieronder zijn degene die een Joomla-site het meest beinvloeden.

6.2 De belangrijkste directives

InstellingWaarom het ertoe doet voor JoomlaEen verstandige waarde
memory_limit Hoeveel geheugen een aanvraag mag gebruiken. Te laag veroorzaakt "Allowed memory size exhausted"-fouten. 256M of meer
max_execution_time Hoe lang een script mag draaien. Van invloed op grote updates, back-ups en imports. 30 tot 120
upload_max_filesize Het grootste bestand dat je kunt uploaden, voor media en extensiepakketten. 32M of meer
post_max_size De grootste POST-body. Moet groter zijn dan upload_max_filesize. Groter dan uploads
max_input_vars Hoeveel formuliervelden PHP accepteert. Lage waarden kappen grote menu's en ACL-formulieren af. 3000 of meer
display_errors Of PHP fouten op de pagina toont. Moet uit staan op productie. Uit op productie

6.3 De uploadval

Een klassiek probleem: je verhoogt upload_max_filesize maar vergeet post_max_size. PHP beperkt de upload stilletjes tot de kleinste van de twee, dus een limiet van 30 MB gedraagt zich als 8 MB. Stel post_max_size altijd groter in dan upload_max_filesize, en onthoud dat Joomla's eigen medialimieten daar bovenop komen.

6.4 Controleer de werkelijke waarde

De waarde in een php.ini-bestand is niet altijd de waarde die PHP echt gebruikt; een later bestand of een host-override kan die wijzigen. Vertrouw op Systeem → Systeeminformatie → PHP-informatie, dat de echte, werkelijke instellingen voor de draaiende site toont.

Naar boven

7. Hoe PHP achter de webserver draait

7.1 De webserver draait PHP niet zelf

De webserver ontvangt de aanvraag, maar geeft het PHP-werk aan een aparte PHP-handler. De handler die je gebruikt beinvloedt snelheid en geheugen meer dan bijna iets anders op de server.

HandlerGebruikt metOpmerkingen
mod_php Apache (oudere opstellingen) PHP draait binnen Apache. Eenvoudig maar zwaar; wordt uitgefaseerd.
PHP-FPM Nginx, Apache, Caddy PHP draait als een eigen pool van processen. De moderne standaard.
LSAPI LiteSpeed, OpenLiteSpeed LiteSpeeds eigen snelle interface.
FastCGI IIS en anderen Algemene interface tussen server en PHP.

7.2 PHP-FPM in gewone woorden

PHP-FPM (FastCGI Process Manager) houdt een pool van PHP-werkers klaar. Wanneer een Joomla-aanvraag binnenkomt, geeft de webserver die aan een vrije werker, die index.php draait en de pagina teruggeeft. Omdat de werkers los staan van de webserver, kun je verschillende PHP-versies draaien voor verschillende sites op een machine en PHP herstarten zonder de webserver te herstarten.

7.3 Meerdere PHP-versies

Daarom kan een enkele server de ene site op PHP 8.3 draaien en de andere op 8.4. De meeste hosting-controlepanelen laten je de PHP-versie per site of per map kiezen. Wanneer je upgradet naar Joomla 6, is dit de instelling die je wijzigt om de site naar PHP 8.3 of nieuwer te brengen. De webserver zelf wordt uitgebreid behandeld in een apart artikel; hier is het punt dat de handler, niet het servermerk, je PHP draait.

Naar boven

8. OPcache, JIT en prestaties

8.1 OPcache: de grootste gratis winst

Normaal leest en compileert PHP je code bij elke afzonderlijke aanvraag. OPcache bewaart de gecompileerde versie van Joomla's PHP in het geheugen, zodat de server de compilatiestap overslaat en de gecachte code meteen draait. Het is de allergrootste gratis snelheidsverbetering voor elke PHP-site, en het staat standaard aan in moderne PHP-builds.

opcache.enable = 1
opcache.memory_consumption = 256     ; megabytes voor gecachte code
opcache.max_accelerated_files = 20000 ; Joomla heeft veel bestanden
opcache.validate_timestamps = 1       ; 1 op shared hosting, 0 alleen met cache-clear bij deploy

Joomla heeft duizenden PHP-bestanden, dus verhoog opcache.max_accelerated_files hoog genoeg om ze allemaal te bevatten, anders begint OPcache bestanden te verwijderen en daalt het voordeel.

8.2 Een waarschuwing bij deploys

Als je opcache.validate_timestamps = 0 instelt voor maximale snelheid, stopt PHP met controleren of bestanden op schijf zijn gewijzigd. Nadat je nieuwe code hebt uitgerold, moet je OPcache wissen (of PHP-FPM herstarten), anders blijft de server de oude versie draaien. Laat op shared hosting de tijdstempelcontrole aan staan.

8.3 De JIT-compiler

PHP 8 voegde een JIT (Just-In-Time)-compiler toe. Die versnelt zware wiskundige en CPU-gebonden code door delen ervan tijdens het draaien naar machinecode te compileren. Voor een typische Joomla-site, die de meeste tijd op de database wacht in plaats van te rekenen, geeft JIT weinig of geen voordeel en kan zelfs overhead toevoegen. Beschouw hem als standaard uit en test voordat je hem inschakelt; OPcache is waar de echte Joomla-winst zit.

8.4 Waar PHP zit tussen de caches

OPcache is een laag in een stapel caches. Hoe dichter bij de top een aanvraag wordt beantwoord, hoe sneller het is:

Server-paginacache   (bereikt PHP helemaal niet)
   ↓
Joomla-cache         (System - Page Cache-plugin, view-caching)
   ↓
OPcache              (gecompileerde PHP in het geheugen)
   ↓
Database             (de traagste laag om te bereiken)
Naar boven

9. Onder de motorkap: hoe Joomla PHP gebruikt

9.1 Objectgeorienteerde PHP en MVC

Modern Joomla is vrijwel volledig objectgeorienteerd. In plaats van lange scripts met code van boven naar beneden, is het werk opgesplitst in classes (blauwdrukken) en objecten (instanties van die blauwdrukken). Een paar ideeen dragen het meeste gewicht:

  • Overerving: een class breidt een andere uit om gedrag te hergebruiken en te specialiseren.
  • Interfaces: een contract dat zegt welke methoden een class moet bieden, zonder te zeggen hoe.
  • Traits: herbruikbare stukken code die over meerdere classes worden gedeeld.
  • Encapsulatie: houd de interne werking prive en bied een schone set methoden aan.

Bovenop OOP volgen Joomla-componenten het MVC-patroon (Model-View-Controller): het model verzorgt de data en de regels, de view rendert de uitvoer en de controller koppelt een aanvraag aan het juiste model en de juiste view. Deze opdeling kennen vertelt je waar elke soort code thuishoort als je een component leest of bouwt.

9.2 Namespaces en autoloading

Moderne Joomla-code is georganiseerd in namespaces en wordt op aanvraag geladen via PSR-4-autoloading. Je schrijft geen lange lijsten met include-opdrachten; je verwijst naar een class via zijn volledige naam en PHP laadt het juiste bestand automatisch.

use Joomla\CMS\Factory;
use Joomla\Database\DatabaseInterface;

9.3 De Factory

De Factory-class is het klassieke toegangspunt tot Joomla's belangrijkste objecten. Het is een handige manier om de applicatie, de database, de huidige gebruiker, het document en de mailer te bereiken:

use Joomla\CMS\Factory;

$app  = Factory::getApplication();                // de huidige applicatie
$user = Factory::getApplication()->getIdentity(); // de huidige gebruiker

De Factory is eenvoudig in gebruik, maar het is een statische lookup. Een aantal van zijn methoden is nu verouderd en wordt in Joomla 7 verwijderd: Factory::getDbo(), Factory::getDocument() en Factory::getUser() geven allemaal een deprecation-waarschuwing en vertellen je om het object in plaats daarvan uit de dependency injection-container te laden (het document en de gebruiker zijn ook bereikbaar via Factory::getApplication()). Voor nieuwe componentcode is de moderne stijl om in plaats daarvan te injecteren wat je nodig hebt, zoals hierna getoond.

9.4 De Dependency Injection-container

Joomla 6 is opgebouwd rond een Dependency Injection (DI)-container. In plaats van dat code zelf zijn afhankelijkheden ophaalt, maakt de container objecten aan en geeft die door ("injecteert") wat ze nodig hebben. Een component registreert zijn services in services/provider.php:

// administrator/components/com_example/services/provider.php
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;

return new class () implements ServiceProviderInterface {
    public function register(Container $container): void
    {
        // registreer hier de services van je component
    }
};

Vervolgens vraagt een class via zijn constructor om wat hij nodig heeft, wat de code schoner en makkelijker te testen maakt:

public function __construct(DatabaseInterface $db)
{
    $this->db = $db;
}

9.5 De database-API

Joomla wil nooit dat je losse SQL door je PHP heen verspreidt. Het biedt een query builder die veilige, overdraagbare SQL voor je schrijft en waarden escapet om SQL-injectie te voorkomen. Haal de database uit de DI-container en bouw de query met createQuery() (het oude getQuery(true) is verouderd):

use Joomla\CMS\Factory;
use Joomla\Database\DatabaseInterface;

$db    = Factory::getContainer()->get(DatabaseInterface::class);
$query = $db->createQuery()
    ->select($db->quoteName(['id', 'title']))
    ->from($db->quoteName('#__content'))
    ->where($db->quoteName('state') . ' = :state')
    ->bind(':state', 1, ParameterType::INTEGER);

$db->setQuery($query);
$articles = $db->loadObjectList();

Het prefix #__ wordt tijdens het draaien vervangen door je echte tabelprefix, en de gebonden parameter houdt de waarde veilig gescheiden van de SQL.

9.6 PSR-standaarden en Composer

Joomla volgt de standaarden van de PHP-gemeenschap: PSR-4 voor autoloading en PSR-12 voor codestijl, en het beheert externe PHP-bibliotheken met Composer. Composer installeert een bibliotheek en zijn afhankelijkheden met een commando, zet PSR-4-autoloading op en zet versies vast zodat een build reproduceerbaar is. Als je extensies bouwt, houdt schrijven volgens deze standaarden je code consistent met de Joomla core en klaar voor de volgende grote Joomla-versie.

Als je eigen extensie een externe bibliotheek nodig heeft, draai dan niet composer install of composer update tegen Joomla's eigen composer.json in de hoofdmap van de site. Die map hoort bij Joomla, en het wijzigen van de inhoud van libraries/vendor/ maakt je site anders dan de officiele release, wat updates breekt en niet wordt ondersteund. Houd in plaats daarvan een aparte composer.json binnen je eigen extensie, draai Composer daar, en lever de resulterende vendor/-map mee verpakt met je component:

com_example/
├─ composer.json        je eigen afhankelijkheden
├─ vendor/              gebouwd door Composer, meegeleverd in je pakket
│   └─ autoload.php
└─ src/                 je componentcode

Laad die meegeleverde autoloader vervolgens een keer vanuit je code (bijvoorbeeld require_once JPATH_ROOT . '/components/com_example/vendor/autoload.php';). Om botsingen te voorkomen wanneer twee extensies dezelfde bibliotheek meeleveren, kun je je meegeleverde namespaces van een prefix voorzien met een tool als PHP-Scoper. Op deze manier reizen je afhankelijkheden mee met je extensie en raken ze nooit Joomla's core bibliotheken.

9.7 Ontwikkelaarsgereedschap

Professionele Joomla-ontwikkelaars werken zelden met PHP alleen. Een kleine set tools vangt bugs lang voordat ze de productie bereiken:

ToolWat het doet
PHPStan Statische analyse: vindt typefouten en bugs zonder de code te draaien.
Rector Geautomatiseerde refactoring: zet code veilig om naar nieuwere PHP-syntaxis.
PHPUnit Geautomatiseerde tests die bevestigen dat code zich na een wijziging nog steeds gedraagt.
PHP_CodeSniffer Controleert en repareert code volgens de PSR-12-stijlregels.
Git + CI Versiebeheer plus een pijplijn die de controles bij elke commit draait.

Joomla's eigen core gebruikt deze tools, en een extensie die ermee is gebouwd is veel makkelijker te onderhouden door PHP- en Joomla-upgrades heen.

Naar boven

10. Je eigen PHP schrijven in Joomla

10.1 De gouden regel: bewerk nooit Joomla core bestanden

De eerste regel bij het schrijven van PHP voor Joomla is om de Joomla core bestanden met rust te laten. Elke wijziging die je in een core bestand maakt wordt bij de volgende update overschreven, en een kapotte aanpassing kan de hele site platleggen. Joomla geeft je in plaats daarvan veilige plekken om je eigen PHP toe te voegen.

10.2 De juiste plekken voor eigen PHP

Je wilt...Gebruik...
Reageren op iets wat Joomla doet Een plugin die naar een event luistert.
Veranderen hoe de uitvoer eruitziet Een template override (een kopie in je template).
Een volledig nieuwe functie toevoegen Een component of een module.
Een geplande taak draaien Een taakplugin voor de Scheduler, of een CLI-commando.

10.3 Breid uit via events, niet via hacks

De schoonste manier om gedrag toe te voegen is reageren op Joomla's Event Dispatcher vanuit een plugin. Joomla vuurt events af op duidelijk gedefinieerde momenten (voordat een artikel wordt opgeslagen, nadat een gebruiker inlogt, en nog veel meer). Een plugin abonneert zich op het event en draait je PHP op het juiste moment, zonder enige core code aan te raken.

10.4 Wees voorzichtig met "PHP in content"

Vroeg of laat vraagt iemand hoe je rauwe PHP in een artikel kunt zetten. Standaard draait Joomla geen PHP in artikeltekst, en dat is maar goed ook: het zou een ernstig beveiligingsrisico zijn. Als je echt code in een contentgebied nodig hebt, gebruik dan een kleine eigen module of een vertrouwde, onderhouden extensie die daarvoor is gemaakt, en houd de daadwerkelijke logica in een echt PHP-bestand, niet geplakt in de editor.

Naar boven

11. Foutmeldingen en PHP debuggen

11.1 De instelling voor foutrapportage

Joomla verpakt PHP's foutrapportage in een keuzelijst bij Systeem → Algemene configuratie → Server → Foutrapportage. Die komt overeen met PHP's eigen niveaus:

OptieWat het doet
Geen Verbergt alle PHP-meldingen.
Standaard Laat het over aan de eigen php.ini van de server.
Eenvoudig Toont minder waarschuwingen; goed voor een rustige productiesite.
Maximaal Toont alles, inclusief notices. Gebruik dit tijdens het ontwikkelen.

11.2 Toon nooit fouten op een live site

Laat PHP op productie geen fouten op de pagina afdrukken. Een zichtbare fout kan bestandspaden, de databasestructuur of andere details onthullen die een aanvaller kan gebruiken. Zet Foutrapportage op Geen of Eenvoudig op een live site, en houd display_errors uit in PHP. Stuur fouten in plaats daarvan naar een logbestand.

11.3 Het witte scherm des doods

Wanneer een fatale PHP-fout optreedt en fouten verborgen zijn, krijg je een blanco witte pagina zonder bericht. Om de echte oorzaak te vinden, zet je Foutrapportage op Maximaal op een testkopie, of lees je het PHP-foutenlog. Het log noemt meestal het exacte bestand en de regel, wat een giswerk omzet in een snelle oplossing.

11.4 Debug-modus

Joomla heeft zijn eigen Debug-instelling in de Algemene configuratie. Wanneer die aan staat, toont Joomla onderaan elke pagina de uitgevoerde databasequery's, de geladen bestanden en het gebruikte geheugen. Het is een krachtig diagnostisch hulpmiddel, maar het toont interne details, dus zet het op productie weer uit.

11.5 Exceptions en logging

Moderne PHP meldt problemen via exceptions: wanneer er iets misgaat, "gooit" code een exception die omhoog reist totdat iets die "opvangt". Goed geschreven Joomla-code verpakt riskante handelingen in een try/catch-blok zodat een enkele storing niet de hele pagina laat crashen:

try {
    $db->setQuery($query);
    $rows = $db->loadObjectList();
} catch (\RuntimeException $e) {
    Log::add($e->getMessage(), Log::ERROR, 'com_example');
}

In plaats van de fout aan de bezoeker te tonen, legt dit hem vast via Joomla's eigen logging. Stuur op productie fouten naar een logbestand en lees ze daar; de stack trace binnen een exception noemt precies de keten van aanroepen die tot de storing leidde.

11.6 Xdebug voor stapsgewijs debuggen

Wanneer het lezen van het log niet genoeg is, is Xdebug het favoriete gereedschap van de ontwikkelaar. Het is een PHP-extensie die verbinding maakt met je editor (zoals PhpStorm of VS Code) en je de code op elke regel laat pauzeren, elke variabele laat inspecteren en Joomla stap voor stap laat doorlopen. Gebruik het alleen op een ontwikkelmachine; Xdebug is traag en mag nooit op een live site draaien.

Naar boven

12. PHP-beveiliging

12.1 Houd PHP gepatcht

De allerbelangrijkste PHP-beveiligingsstap is een ondersteunde versie draaien en de updates ervan toepassen. De meeste PHP-beveiligingsfixes komen via kleine updates (8.3.x), die je host toepast zonder dat je iets aan Joomla verandert. Een PHP-versie waarvan de levensduur is verlopen krijgt deze fixes helemaal niet meer.

12.2 Bescherm geheimen in PHP-bestanden

Je configuration.php bevat het databasewachtwoord in leesbare PHP. Zorg dat de webserver het nooit als download serveert, houd de rechten strak, en laat nooit bewerkbare kopieen zoals configuration.php.save of configuration.php.bak in de webroot staan.

12.3 Schakel gevaarlijke functies uit

PHP heeft functies die legitieme Joomla-code zelden nodig heeft maar die aanvallers graag gebruiken, zoals exec, shell_exec, system en passthru. Een geharde server schakelt ze uit in php.ini:

disable_functions = exec,passthru,shell_exec,system,proc_open,popen

Test na deze wijziging, want een paar extensies (bijvoorbeeld sommige back-uptools) gebruiken er een legitiem. Schakel uit wat je site niet nodig heeft.

12.4 Beperk waar PHP bij kan

De instelling open_basedir beperkt PHP tot een lijst van mappen, zodat een gecompromitteerd script geen bestanden elders op de server kan lezen. Op shared hosting stelt de provider dit meestal voor je in; op je eigen server is het een nuttige extra laag rond elke site.

12.5 Schrijf veilige code: filter, escape, tokeniseer

De secties hierboven harden de server. Als je PHP voor Joomla schrijft, moet de code zelf ook veilig zijn. De meeste echte kwetsbaarheden komen voort uit het vertrouwen van gebruikersinvoer, niet uit PHP zelf. Drie gewoonten voorkomen de veelvoorkomende aanvallen:

  • Filter invoer: lees nooit $_GET of $_POST rechtstreeks. Gebruik Joomla's input-object, dat de waarde opschoont naar het type dat je opvraagt: $id = $app->getInput()->getInt('id');
  • Escape uitvoer: voordat je data in een template afdrukt, escape je het zodat het geen HTML of scripts kan injecteren: echo $this->escape($title); Dit stopt cross-site scripting (XSS).
  • Gebruik CSRF-tokens: elk formulier dat data wijzigt moet een token bevatten, en de controller moet het controleren, zodat een aanvraag niet vanaf een andere site kan worden vervalst:
// in het formulier
echo HTMLHelper::_('form.token');

// in de controller
$this->checkToken();

Samen met prepared statements voor de database (zie sectie 9.5) vormen deze de kern van veilige Joomla-PHP: schoon wat binnenkomt, escape wat naar buiten gaat, en bewijs dat elke wijziging bedoeld was.

12.6 Het echte risico is meestal oude code

De meeste Joomla-compromitteringen misbruiken niet PHP de taal; ze misbruiken een verouderde extensie of een ongepatchte Joomla core. PHP harden is belangrijk, maar het zit bovenop de basis: werk Joomla en elke extensie bij, verwijder wat je niet gebruikt, en eis meervoudige authenticatie voor beheerders.

Naar boven

13. PHP op de commandoregel en webservices

13.1 PHP voorbij de browser

PHP draait niet alleen wanneer een browser om een pagina vraagt. Het draait ook vanaf de commandoregel, en Joomla levert daar een commandoregelapplicatie voor. Vanuit de hoofdmap van de site kun je onderhoudstaken draaien zonder browser:

php cli/joomla.php core:update:check
php cli/joomla.php scheduler:run
php cli/joomla.php extension:list

Dit is de betrouwbare manier om lange taken zoals updates of geplande taken te draaien, omdat de commandoregel niet gebonden is aan de max_execution_time van de webserver.

13.2 De CLI gebruikt een andere php.ini

Een veelvoorkomende verrassing: de commandoregel gebruikt vaak een andere php.ini dan de website, en soms een andere PHP-versie. Als een CLI-taak zich anders gedraagt dan de site, controleer dan welke PHP-binary en welke instellingen de commandoregel gebruikt met php -v en php --ini.

13.3 PHP drijft de Web Services-API aan

Joomla's Web Services-API is ook PHP, draaiend via zijn eigen front controller op api/index.php. Een extern programma stuurt een HTTP-aanvraag met een token, en PHP draait dezelfde Joomla-code om content te lezen of te wijzigen:

curl -H "X-Joomla-Token: <token>" \
  https://example.test/api/index.php/v1/content/articles

Of de aanvraag nu van een browser, de commandoregel of de API komt, dezelfde PHP-applicatie beantwoordt hem; alleen het toegangspunt verschilt.

Naar boven

14. PHP up-to-date houden

14.1 Plan de upgrade, overhaast hem niet

Overstappen naar een nieuwere PHP-versie is meestal pijnloos, maar het kan een oude extensie breken die een functie gebruikt die PHP heeft verwijderd. Behandel een PHP-upgrade als elke andere wijziging: test hem eerst.

  • Lees de PHP-migratienotities voor de nieuwe versie.
  • Werk Joomla en alle extensies eerst bij naar hun nieuwste versies.
  • Test op een staging-kopie met de nieuwe PHP-versie voordat je productie aanraakt.
  • Houd het foutenlog in de gaten op deprecation-waarschuwingen van extensies.

14.2 Gebruik Joomla's pre-update-controle

Voor een Joomla-update controleert de component Joomla bijwerken of je PHP-versie voldoet aan het minimum van de doelrelease. Als die waarschuwt dat je PHP te oud is, verhoog dan de PHP-versie (meestal een kwestie van een klik in je hosting-paneel) voordat je de Joomla-update draait.

14.3 De volgorde die werkt

1. Maak een back-up van bestanden en database
2. Werk Joomla en alle extensies bij
3. Test op staging
4. Schakel op staging over op de nieuwe PHP-versie
5. Test opnieuw
6. Herhaal op productie

Deze volgorde houdt de twee wijzigingen (Joomla-versie en PHP-versie) genoeg gescheiden dat je, als er iets breekt, weet welke van de twee de oorzaak was.

Naar boven

15. SEO en metadata

PHP heeft geen eigen SEO-instellingen, en toch beinvloedt het de zoekresultaten via een ding waar zoekmachines om geven: snelheid. Google meet hoe snel je server een pagina begint te versturen (Time To First Byte), en die tijd is grotendeels PHP die zijn werk doet.

  • Een snelle PHP-versie verlaagt de serverreactietijd, wat de Core Web Vitals voedt en de ranking helpt.
  • OPcache verkort de tijd die PHP besteedt aan compileren bij elke aanvraag, zodat pagina's eerder beginnen aan te komen.
  • Genoeg geheugen voorkomt half-gerenderde pagina's en foutpagina's, die crawlers als kapot behandelen.
  • Correcte foutafhandeling betekent dat een ontbrekende pagina een echte 404 van Joomla teruggeeft, niet een fatale PHP-fout met een 200-status die crawlers in de war brengt.

Kortom: je optimaliseert PHP niet rechtstreeks voor SEO. Je houdt PHP snel, goed voorzien van middelen en foutvrij, en goede Core Web Vitals volgen vanzelf.

Naar boven

16. Veelgemaakte fouten en valkuilen

16.1 Joomla bijwerken op oude PHP

Symptoom: de Joomla 6-update weigert te draaien, of de site toont een "niet-ondersteunde PHP-versie"-pagina.

Oplossing: verhoog PHP eerst naar 8.3 of nieuwer in je hosting-paneel, draai daarna de Joomla-update.

16.2 Geheugenfouten

Symptoom: "Allowed memory size of N bytes exhausted" tijdens een installatie, update of grote pagina.

Oplossing: verhoog memory_limit (256M is een veilige basis) en controleer of geen enkele extensie lekt of te veel tegelijk laadt.

16.3 De upload die niet wil groeien

Symptoom: je verhoogt upload_max_filesize maar grote bestanden mislukken nog steeds bij het uploaden.

Oplossing: verhoog ook post_max_size boven upload_max_filesize, en controleer Joomla's eigen mediagroottelimieten.

16.4 Fouten zichtbaar op de live site

Symptoom: PHP-waarschuwingen of notices verschijnen bovenaan openbare pagina's.

Oplossing: zet Foutrapportage op Geen of Eenvoudig in de Algemene configuratie en houd display_errors uit op productie.

16.5 Een core bestand bewerken

Symptoom: een aanpassing verdwijnt na een Joomla-update, of de update mislukt.

Oplossing: bewerk nooit Joomla core PHP bestanden. Verplaats de wijziging naar een plugin, een override of je eigen component.

16.6 Verouderde code na een deploy

Symptoom: je uploadt nieuwe PHP, maar de site blijft de oude versie draaien.

Oplossing: wis OPcache of herstart PHP-FPM na het uitrollen, vooral wanneer opcache.validate_timestamps 0 is.

16.7 Een typefout in configuration.php

Symptoom: de hele site is een blanco pagina na een handmatige bewerking van configuration.php.

Oplossing: herstel je back-up van het bestand. Een enkele ontbrekende puntkomma of aanhalingsteken breekt heel Joomla, omdat het bestand PHP is.

Naar boven

17. Best practices

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

  • Draai een ondersteunde PHP-versie: minimaal 8.3 voor Joomla 6, en bij voorkeur de nieuwste die je extensies toelaten.
  • Draai nooit een PHP-tak waarvan de levensduur is verlopen; die krijgt geen beveiligingsfixes.
  • Houd OPcache aan en groot genoeg om alle Joomla-bestanden te bevatten.
  • Gebruik PHP-FPM of LSAPI in plaats van het oude mod_php.
  • Stel memory_limit in op 256M of meer, en post_max_size boven upload_max_filesize.
  • Verberg PHP-fouten op productie; toon ze alleen op een testkopie.
  • Bewerk nooit core bestanden; breid uit met plugins, overrides, componenten en events.
  • Filter in je eigen code de invoer, escape de uitvoer, gebruik CSRF-tokens en de database-query-builder.
  • Bescherm configuration.php en verwijder alle back-upkopieen uit de webroot.
  • Test een PHP-upgrade op staging, nadat je Joomla en alle extensies hebt bijgewerkt.
  • Controleer de echte instellingen in Systeeminformatie, niet alleen de php.ini op schijf.
Naar boven

18. In het kort

MINIMALE PHP  Joomla 6 heeft PHP 8.3.0 of nieuwer nodig
CONTROLEER    Systeem → Systeeminformatie → PHP-informatie
CONFIGBESTAND configuration.php = een PHP-class (JConfig); bevat DB-wachtwoord
TOEGANGSPUNT  index.php (site), administrator/index.php (admin), api/index.php (API)
BEWAKER       defined('_JEXEC') or die;  bovenaan elk PHP bestand
EXTENSIES     mysqli/pdo_mysql, json, gd/imagick, intl, mbstring, zip, curl, openssl
PHP.INI       memory_limit 256M+, post_max_size > upload_max_filesize, max_input_vars 3000+
HANDLER       PHP-FPM of LSAPI (niet mod_php) + OPcache aan
OPCACHE       Verhoog max_accelerated_files; wis hem na deploys
JIT           Weinig voordeel voor Joomla; laat uit tenzij getest
DEV BASIS     OOP + MVC, namespaces, PSR-4/PSR-12, Composer
DEV API       Factory, DI-container (services/provider.php), database-query-builder
DEV TOOLS     PHPStan, Rector, PHPUnit, PHP_CodeSniffer, Git + CI
EIGEN PHP     Plugins, overrides, componenten, events - nooit core hacks
FOUTEN        Geen/Eenvoudig op productie; Maximaal alleen op een testkopie
DEBUG         Exceptions + logging; Xdebug alleen op ontwikkeling
CLI           php cli/joomla.php ...  (gebruikt een eigen php.ini)
BEVEILIGING   Patch PHP, disable_functions, open_basedir, bescherm geheimen
VEILIGE CODE  Filter invoer, escape uitvoer, CSRF-tokens, prepared statements
UPGRADE       Werk Joomla + extensies bij, test op staging, verhoog dan PHP
Naar boven

19. Samenvatting

PHP is de motor onder elke Joomla-site. Je schrijft er misschien nooit een regel van, maar de keuzes eromheen bepalen hoe je site presteert en hoe veilig hij is:

  • Versie: Joomla 6 heeft PHP 8.3 of nieuwer nodig, en een actuele tak is sneller en veiliger dan een oude.
  • Configuratie: een handvol php.ini-instellingen (geheugen, uploads, foutweergave) voorkomen de meest voorkomende Joomla-fouten.
  • Prestaties: OPcache en een moderne handler zoals PHP-FPM geven het grootste deel van de snelheid, met weinig moeite.
  • Ontwikkeling: Joomla gebruikt PHP via namespaces, de Factory, de DI-container en een veilige database-API, en het geeft je schone plekken om je eigen code toe te voegen.
  • Beveiliging: een gepatchte PHP-versie, beschermde geheimen en verborgen fouten houden de motor stil en veilig.

De meeste PHP-problemen op een Joomla-site zijn configuratieproblemen, geen codeproblemen: een oude versie die een upgrade blokkeert, een geheugenlimiet die te laag is, fouten die op een live pagina lekken, of een met de hand bewerkte configuration.php. Ze zijn snel op te lossen zodra je weet waar je moet kijken.

Als je Joomla-site traag is, geheugenfouten geeft of weigert bij te werken vanwege de PHP-versie, ligt de oorzaak meestal in de PHP-laag en niet in Joomla zelf. Een zorgvuldige blik op de versie, de OPcache en de belangrijkste php.ini-instellingen lost het vaak snel op, en het is precies het soort fundamentwerk dat een site jarenlang snel en veilig houdt.

Naar boven
PHP voor Joomla
Peter Martin
Peter Martin
Joomla Specialist

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

Veelgestelde vragen

Wat is PHP in Joomla?

PHP is de programmeertaal waarop Joomla draait. Telkens wanneer iemand een Joomla-pagina bezoekt, verwerkt PHP het verzoek, haalt het de inhoud op, laadt het extensies en genereert het de HTML die naar de browser wordt verzonden. Zonder PHP kan Joomla niet functioneren.

Wat is de beste PHP versie voor Joomla 6?

De beste PHP versie voor Joomla 6 is PHP 8.4, terwijl PHP 8.3 de minimaal ondersteunde versie is. Het gebruik van de aanbevolen PHP-versie verbetert de prestaties, beveiliging, het geheugengebruik en de compatibiliteit. Controleer vóór het upgraden altijd de huidige vereisten in de officiële Joomla-documentatie en houd PHP up-to-date met de nieuwste beveiligingspatches. Zie voor technische vereisten: Joomla! Programmers Documentation: Requirements for Joomla! 6.x.

Welke invloed heeft PHP op de prestaties van Joomla?

PHP heeft een grote invloed op de prestaties van Joomla. Het gebruik van een recente PHP-versie met ingeschakelde OPcache verkort de laadtijd van pagina’s, vermindert de belasting van de server en zorgt ervoor dat websites sneller werken. Een juiste PHP-configuratie, in combinatie met de cachingfuncties van Joomla, zorgt voor een aanzienlijke verbetering van de gebruikerservaring.

Wat is OPcache en waarom zou Joomla dit moeten gebruiken?

OPcache is een ingebouwde PHP-extensie die gecompileerde PHP-code in het geheugen opslaat. In plaats van Joomla-bestanden bij elk verzoek opnieuw te compileren, hergebruikt OPcache de gecompileerde code, waardoor het CPU-gebruik daalt en pagina’s sneller worden geladen. Het is een van de eenvoudigste manieren om de prestaties van Joomla te verbeteren.

Is PHP-beveiliging belangrijk voor Joomla-websites?

Ja. Een verouderde PHP-versie kan uw Joomla-website blootstellen aan bekende beveiligingsrisico’s. Houd PHP up-to-date, schakel onnodige PHP-functies uit, gebruik veilige serverinstellingen en werk Joomla en extensies van derden altijd bij om beveiligingsrisico’s te beperken.

Moet ik PHP kennen om Joomla te kunnen gebruiken?

Nee. De meeste Joomla-gebruikers kunnen websites bouwen en beheren zonder PHP te schrijven. Als je echter de basisbeginselen van PHP begrijpt, kun je de juiste hosting kiezen, je server correct configureren, problemen oplossen en indien nodig aangepaste sjablonen of extensies ontwikkelen.