Welche PHP-Version apt install php einspielt, hängt nicht davon ab, was deine Anwendung braucht, sondern allein davon, welches Debian du einsetzt. Debian 12 liefert 8.2, Debian 13 liefert 8.4. Etwas dazwischen gibt es nicht, und auswählen lässt sich auch nichts.

Welche Version bringt welches Debian mit

Jede Debian-Veröffentlichung friert genau eine PHP-Version ein und pflegt sie über die gesamte Laufzeit mit Sicherheitskorrekturen.

DebianCodenamePHP
11bullseye7.4
12bookworm8.2
13trixie8.4

Welches Release bei dir läuft, verrät:

cat /etc/debian_version; lsb_release -sc

Die Versionsnummer in den Paketen bleibt dabei stehen, auch wenn Korrekturen einfließen. Debian erhöht stattdessen die eigene Revision — aus 8.2.20-1~deb12u1 wird 8.2.20-1~deb12u2. Dass die Upstream-Nummer älter aussieht als die aktuelle PHP-Version, heißt also nicht, dass Lücken offen sind.

Reicht die mitgelieferte Version nicht, ist das Repository von Ondřej Surý der übliche Weg. Es führt PHP 5.6 bis 8.6 für aktuelle Debian-Versionen; die Einrichtung steht unter PHP via Sury installieren.

Welche Pakete du wirklich brauchst

Das Metapaket php zieht eine ganze Reihe Abhängigkeiten mit, darunter Apache und libapache2-mod-php. Auf einem Server, der nginx verwendet oder PHP nur auf der Kommandozeile braucht, ist das unerwünscht. Installiere deshalb gezielt.

Für Cronjobs oder Composer genügt die Kommandozeile:

sudo apt install php-cli

Hinter einem Webserver ist PHP-FPM die übliche Wahl. Es läuft als eigener Dienst, mit dem Apache und nginx gleichermaßen sprechen:

sudo apt install php-fpm

Dazu kommen die Erweiterungen, die deine Anwendung verlangt. Diese Auswahl deckt die meisten Webanwendungen ab:

sudo apt install php-mysql php-curl php-gd php-mbstring php-xml php-zip php-intl php-bcmath
PaketWofür
php-mysqlMySQL und MariaDB, stellt PDO und mysqli bereit
php-curlHTTP-Anfragen aus der Anwendung heraus
php-gdBildbearbeitung, Vorschaubilder, Captchas
php-mbstringZeichenketten mit Umlauten und Mehrbyte-Zeichen
php-xmlXML, SimpleXML, DOM
php-zipArchive lesen und schreiben
php-intlSortierung, Datums- und Zahlenformate nach Sprachraum
php-bcmathRechnen mit beliebiger Genauigkeit

php-json steht in vielen älteren Anleitungen und existiert nicht mehr. Seit PHP 8.0 ist JSON fest eingebaut; der Installationsversuch endet mit einer Meldung über ein unbekanntes Paket.

Apache anbinden

Zwei Wege führen zum Ziel, und sie schließen sich gegenseitig aus.

Über PHP-FPM

Der empfohlene Weg, weil er mit dem schnelleren mpm_event zusammenarbeitet.

sudo apt install php-fpm libapache2-mod-fcgid
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.2-fpm
sudo systemctl reload apache2

Die Zahl in php8.2-fpm musst du an deine Version anpassen. Welche Konfigurationen bereitstehen, zeigt ls /etc/apache2/conf-available/ | grep fpm.

Über mod_php

sudo apt install libapache2-mod-php

Funktioniert, zwingt Apache aber auf mpm_prefork, weil mod_php nicht threadsicher ist. Auf einem Server mit vielen gleichzeitigen Verbindungen kostet das spürbar Leistung. Wechselst du später von mod_php zu FPM, musst du das Modul erst abschalten:

sudo a2dismod php8.2 mpm_prefork
sudo a2enmod mpm_event proxy_fcgi setenvif
sudo a2enconf php8.2-fpm
sudo systemctl restart apache2

nginx anbinden

nginx kennt kein mod_php, hier führt nur FPM zum Ziel. Im Server-Block:

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}

Den tatsächlichen Pfad des Sockets bestätigst du mit ls /run/php/. Nach Änderungen testen und neu laden:

sudo nginx -t && sudo systemctl reload nginx

Die zwei php.ini

Debian legt getrennte Konfigurationen für Kommandozeile und FPM an:

/etc/php/8.2/cli/php.ini      ← php auf der Kommandozeile
/etc/php/8.2/fpm/php.ini      ← PHP hinter dem Webserver

Wer upload_max_filesize ändert und sich wundert, dass die Weboberfläche weiterhin blockt, hat die falsche Datei erwischt. Welche Datei ein Aufruf tatsächlich liest, verrät:

php -i | grep "Loaded Configuration File"

Für die Weboberfläche gilt dasselbe über ein PHP-Skript mit phpinfo(). Nach jeder Änderung an der FPM-Konfiguration ist ein Neustart des Dienstes nötig, ein Neuladen des Webservers reicht nicht:

sudo systemctl restart php8.2-fpm
Achtung
Lass kein phpinfo()-Skript dauerhaft erreichbar liegen. Es verrät Pfade, geladene Erweiterungen, Versionsnummern und Teile der Konfiguration — eine fertige Landkarte für jeden, der die Seite findet. Nach der Prüfung löschen.

Prüfen, ob es läuft

php -v
php -m
systemctl status php8.2-fpm

php -v nennt die Version der Kommandozeile, php -m listet die geladenen Erweiterungen. Fehlt eine, die du installiert hast, wurde der Dienst nach der Installation nicht neu gestartet.

Fehlerbehebung

ProblemUrsache und Lösung
Der Browser bietet die PHP-Datei zum Download anPHP ist nicht am Webserver angebunden. FPM-Konfiguration aktivieren oder fastcgi_pass prüfen.
php -v zeigt eine andere Version als die WeboberflächeKommandozeile und FPM können unterschiedliche Versionen nutzen. Siehe Mehrere PHP-Versionen.
Änderung in der php.ini wirkt nichtFalsche der beiden Dateien bearbeitet, oder php-fpm nicht neu gestartet.
Erweiterung fehlt trotz InstallationDienst nicht neu gestartet, oder Paket für eine andere PHP-Version installiert.
php-json lässt sich nicht installierenSeit PHP 8.0 fest eingebaut, es gibt kein eigenes Paket.
Apache startet nach dem Wechsel zu FPM nichtmpm_prefork und mpm_event sind gleichzeitig aktiv. Eines abschalten.
Socket unter /run/php/ nicht vorhandenFPM läuft nicht. systemctl status php8.2-fpm zeigt den Grund.

Häufige Fragen zu PHP unter Debian

Welche PHP-Version hat mein Debian?

Debian 11 bringt PHP 7.4, Debian 12 bringt 8.2 und Debian 13 bringt 8.4. Eine andere Version aus den Debian-Quellen gibt es nicht; dafür brauchst du ein zusätzliches Repository.

Brauche ich php-fpm oder libapache2-mod-php?

Für neue Installationen PHP-FPM. Es arbeitet mit Apache und nginx gleichermaßen und erlaubt das schnellere mpm_event. mod_php zwingt Apache auf mpm_prefork und ist heute die schlechtere Wahl.

Wo liegt die php.ini?

Unter /etc/php/<version>/cli/php.ini für die Kommandozeile und /etc/php/<version>/fpm/php.ini für den Webserver. Beide sind getrennt. php -i | grep "Loaded Configuration File" zeigt, welche gerade gilt.

Wie bekomme ich eine neuere PHP-Version als Debian anbietet?

Über das Sury-Repository, das PHP 5.6 bis 8.6 für aktuelle Debian-Versionen bereitstellt. Die Einrichtung steht unter PHP via Sury installieren.

Muss ich nach einer Konfigurationsänderung neu starten?

Bei FPM ja: systemctl restart php8.2-fpm. Ein Neuladen des Webservers reicht nicht, weil PHP in einem eigenen Dienst läuft.