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.
| Debian | Codename | PHP |
|---|---|---|
| 11 | bullseye | 7.4 |
| 12 | bookworm | 8.2 |
| 13 | trixie | 8.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
| Paket | Wofür |
|---|---|
php-mysql | MySQL und MariaDB, stellt PDO und mysqli bereit |
php-curl | HTTP-Anfragen aus der Anwendung heraus |
php-gd | Bildbearbeitung, Vorschaubilder, Captchas |
php-mbstring | Zeichenketten mit Umlauten und Mehrbyte-Zeichen |
php-xml | XML, SimpleXML, DOM |
php-zip | Archive lesen und schreiben |
php-intl | Sortierung, Datums- und Zahlenformate nach Sprachraum |
php-bcmath | Rechnen 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
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
| Problem | Ursache und Lösung |
|---|---|
| Der Browser bietet die PHP-Datei zum Download an | PHP ist nicht am Webserver angebunden. FPM-Konfiguration aktivieren oder fastcgi_pass prüfen. |
php -v zeigt eine andere Version als die Weboberfläche | Kommandozeile und FPM können unterschiedliche Versionen nutzen. Siehe Mehrere PHP-Versionen. |
Änderung in der php.ini wirkt nicht | Falsche der beiden Dateien bearbeitet, oder php-fpm nicht neu gestartet. |
| Erweiterung fehlt trotz Installation | Dienst nicht neu gestartet, oder Paket für eine andere PHP-Version installiert. |
php-json lässt sich nicht installieren | Seit PHP 8.0 fest eingebaut, es gibt kein eigenes Paket. |
| Apache startet nach dem Wechsel zu FPM nicht | mpm_prefork und mpm_event sind gleichzeitig aktiv. Eines abschalten. |
Socket unter /run/php/ nicht vorhanden | FPM 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.