Kort gezegd: PHP compileren betekent het officiële bronpakket van php.net downloaden, met ./configure de gewenste interfaces en extensies vastleggen, met make bouwen, met make test controleren en daarna installeren. Dat geeft volledige controle over versie en omvang. De prijs: voor elke beveiligingsupdate bent u zelf verantwoordelijk, zoals onlangs bij PHP2Shell, toen opnieuw moest worden gebouwd en alle processen opnieuw moesten worden gestart.
Wanneer eigen PHP-builds zinvol zijn
De meeste servers betrekken PHP uit een pakketbron: uit de Linux-distributie, een repository van een derde partij of via een containerimage. Dat is voor normaal bedrijf meestal de beste keuze, omdat beveiligingscorrecties automatisch worden nageleverd.
Eigen builds hebben toch hun plaats:
| Situatie | Pakketbron | Eigen build |
|---|---|---|
| Normale webserver | meestal beter | zelden nodig |
| Versie of optie niet in betrouwbare bron | niet beschikbaar | zinvol |
| Foutopsporing aan PHP zelf, debug-build | beperkt | zinvol |
| Minimale functionaliteit voor speciale systemen | beperkt | zinvol |
| Beveiligingsupdates | komen met de bron | eigen taak |
Wie voor eigen builds kiest, heeft een vast proces voor updates nodig, anders wordt het voordeel een risico.
Vereisten
Volgens de handleiding zijn GNU make en een C-compiler nodig; sinds PHP 8.4 moet de compiler C11 ondersteunen. Wie uit de Git-repository bouwt in plaats van uit een releasepakket, heeft bovendien autoconf (vanaf 2.68), re2c (vanaf 1.0.3 voor PHP 8.3 en nieuwer) en bison (vanaf 3.0.0) nodig. De README in de broncode noemt voor Ubuntu deze start:
sudo apt install -y pkg-config build-essential autoconf bison re2c libxml2-dev libsqlite3-dev
Voor elke extra extensie komen de passende ontwikkelpakketten erbij, bijvoorbeeld voor OpenSSL of libsodium.
Broncode laden en echtheid controleren
Een zelfgebouwd PHP is slechts zo betrouwbaar als zijn broncode. php.net biedt elk pakket aan met SHA-256-controlesom en GPG-handtekening; de sleutels van de release managers staan op de downloadpagina en de pagina met de GPG-sleutels.
curl -O https://www.php.net/distributions/php-8.4.27.tar.xz
curl -O https://www.php.net/distributions/php-8.4.27.tar.xz.asc
sha256sum php-8.4.27.tar.xz # vergelijken met de waarde op php.net
gpg --verify php-8.4.27.tar.xz.asc php-8.4.27.tar.xz
Pas als controlesom en handtekening kloppen, gaat het verder.
PHP compileren: configure, make, test
Het verloop heeft vier stappen:
- Configureren:
./configuremet de gewenste opties. Bij het bouwen uit Git eerst./buildconfuitvoeren. - Bouwen:
make -j"$(nproc)"; het aantal jobs komt volgens de README zinvol overeen met het aantal processorkernen. - Testen:
make TEST_PHP_ARGS=-j4 testvoert de testsuite van PHP uit. - Installeren:
make install, afhankelijk van de doelmap met root-rechten.
Een voorbeeld voor een PHP-FPM-build met eigen doelmap:
tar xf php-8.4.27.tar.xz && cd php-8.4.27
./configure --prefix=/opt/php-8.4 \
--with-config-file-path=/opt/php-8.4/etc \
--enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --with-fpm-systemd \
--with-openssl --with-sodium \
--disable-cgi
make -j"$(nproc)"
make TEST_PHP_ARGS=-j4 test
sudo make install
/opt/php-8.4/bin/php -v
De belangrijkste opties in een overzicht:
| Optie | Werking |
|---|---|
--enable-fpm |
bouwt PHP-FPM; daarbij --with-fpm-user, --with-fpm-group, --with-fpm-systemd |
--with-config-file-path |
map waarin PHP de php.ini zoekt |
--with-openssl |
OpenSSL-ondersteuning; sinds PHP 7.4 wordt het pad via pkg-config gevonden |
--with-sodium |
moderne cryptografie met libsodium |
--disable-cgi |
ziet af van de CGI-variant als die niet nodig is |
--enable-debug |
debug-symbolen, volgens de README aanbevolen voor ontwikkeling, niet voor productie |
--enable-zts |
threadveiligheid voor bedrijfsmodi met threads |
Met --prefix kunnen meerdere zelfgebouwde versies naast elkaar worden geïnstalleerd, bijvoorbeeld onder /opt/php-8.3 en /opt/php-8.4. Dat vergemakkelijkt omschakelingen, maar vraagt discipline: elke geïnstalleerde versie is eigen software die bij elke beveiligingsrelease opnieuw moet worden gebouwd, ook als er op dat moment geen website gebruik van maakt. Niet meer benodigde builds horen volledig te worden verwijderd. Welke opties een bestaande build heeft, toont php -i in de regel „Configure Command”; ze is het beste sjabloon voor de volgende nieuwbouw.
Aanwijzing over OPcache: sinds PHP 8.5 is OPcache volgens de aangenomen RFC vast ingecompileerd. Bij oudere versies wordt het als extensie gebouwd en via zend_extension geladen. Wat extensies en interfaces zijn, leggen PHP-extensies begrijpen en SAPI uitgelegd uit.
Eigen builds en beveiliging: de verplichtingen na PHP2Shell
Zelf gecompileerd PHP heeft een echt beveiligingsvoordeel: u bouwt alleen wat u nodig hebt. Elke niet gebouwde extensie en elke niet gebouwde bedrijfsmodus is code die geen lek kan bevatten. Een build zonder CGI, met weinig extensies en duidelijke paden is overzichtelijk.
Daar staat een harde verplichting tegenover. Distributies hebben bij PHP2Shell backports deels op 21 oktober 2026 geleverd; wie zelf bouwt, krijgt niets automatisch. Concreet betekende dat:
- Broncode van de fix-versie laden en controleren.
- Met identieke opties opnieuw bouwen;
php -itoont de oorspronkelijke configure-regel. - Tests uitvoeren en installeren.
- Alle PHP-processen opnieuw starten, zoals beschreven onder PHP-FPM en alle workers opnieuw starten.
- De draaiende versie controleren, zoals uitgelegd onder PHP-versie en patchstatus goed controleren.
Een zelfgebouwd PHP verschijnt in geen enkele pakketbeheerder. Houd een inventaris bij van op welke servers eigen builds in welke versie draaien, anders worden ze bij het volgende lek over het hoofd gezien.
Hoe helpt PHP SOS concreet?
Via de PHP-patchservice ondersteunen wij beheerders van eigen builds:
- Bestand inventariseren: Wij vinden zelfgebouwde PHP-versies en lezen hun buildopties uit.
- Opnieuw bouwen: Fix-versie met gecontroleerde handtekening, dezelfde opties en volledige testrun.
- Uitrollen en herstarten: Installatie, herstart van alle processen, controle van de draaiende versie.
- Vereenvoudigen: Waar een onderhouden pakketbron hetzelfde doel dient, tonen wij de overstap.
Veelgestelde vragen
Wanneer loont het om PHP zelf te compileren?
Als een benodigde versie of optie in geen enkele betrouwbare pakketbron beschikbaar is, voor ontwikkeling en foutopsporing aan PHP zelf of voor zeer slanke, speciale builds. Voor gewone webservers zijn onderhouden pakketten meestal de betere keuze.
Hoe controleer ik dat de PHP-broncode echt is?
php.net biedt bij elk bronpakket een SHA-256-controlesom en een GPG-handtekening aan. Vergelijk de controlesom en controleer de handtekening met de op php.net gepubliceerde sleutels van de release managers.
Moet ik na een beveiligingsrelease opnieuw compileren?
Ja. Een zelfgebouwd PHP krijgt geen updates van de distributie. Na PHP2Shell betekende dat: broncode van 8.5.12, 8.4.27, 8.3.36 of 8.2.35 bouwen, installeren en alle PHP-processen opnieuw starten.
Waar vind ik alle configure-opties?
Met ./configure --help in de bronmap. De handleiding noemt de belangrijkste kernopties, opties voor extensies staan op hun handleidingspagina's.