Level 3 - PHP Tuning

Geschrieben von Joachim Namyslo

Ein Chefkoch am Herd in einer Profiküche mit dem Titel "Der Chefkoch (PHP installieren)".

Lesedauer: 3 Minuten

Dein Kellner (Apache) steht bereit. Er hat Block und Stift in der Hand. Aber wenn jetzt ein Gast reinkommt und „Einmal Drupal, bitte!“ bestellt, passiert... nichts. Die Küche ist leer.

Wir brauchen einen Chefkoch. Wir brauchen PHP. Aber für unser Enterprise-Setup stellen wir keinen Hobby-Koch ein, der in einer Suppe rührt. Wir engagieren eine ganze Küchenbrigade: PHP-FPM (FastCGI Process Manager).

Während das alte PHP jede Bestellung einzeln abgearbeitet hat, kann FPM hunderte Teller gleichzeitig anrichten. Und weil wir auf Ubuntu 26.04 sind, bekommen wir direkt die neueste, stabilste Version serviert: PHP 8.5.

Die Brigade anheuern (Installation)

Drupal ist anspruchsvoll. Es braucht nicht nur den Koch (Core), sondern auch viele Spezialwerkzeuge (Extensions) für Bilder, Datenbanken und Verschlüsselung.

Wir installieren gleich zwei Datenbank-Treiber: php8.5-mysql für MariaDB (unser Drupal-Fundament) und php8.5-pgsql für PostgreSQL (unsere spätere AI-Datenbank mit pgvector). So kann PHP später mit beiden Datenbanken gleichzeitig reden.

Kopiere diesen Befehl (er ist lang, aber er enthält alles, was Drupal CMS braucht):

sudo apt install php8.5-fpm php8.5-common php8.5-mysql php8.5-pgsql php8.5-gd php8.5-cli php8.5-curl php8.5-zip php8.5-xml php8.5-mbstring php8.5-intl php8.5-bcmath php8.5-opcache -y
  • fpm: Der Turbo-Modus.
  • mysql: Die Verbindung zu MariaDB, dem Zuhause deines Drupal.
  • pgsql: Die Verbindung zu PostgreSQL, unserer künftigen AI-Datenbank.
  • gd: Für Bildbearbeitung (Thumbnails).
  • opcache: Ganz wichtig für den Speed (dazu gleich mehr).

Den Motor frisieren (Konfiguration)

Standardmäßig ist PHP sehr "konservativ" eingestellt. Es darf nur 128 MB RAM nutzen. Für ein kleines Blog okay, aber für Drupal CMS + AI? Keine Chance. Wir schrauben das Limit hoch.

Wir bearbeiten die Konfigurationsdatei php.ini für FPM:

sudo nano /etc/php/8.5/fpm/php.ini

Jetzt nutzen wir die Suchfunktion von Nano (STRG + W) und suchen nach folgenden Begriffen. Ändere die Werte wie folgt:

  1. Suche: memory_limit
    • Ändere zu: memory_limit = 512M
    • Warum? Drupal braucht Platz zum Atmen. 512 MB sind der Sweetspot für schnelle Ladezeiten.
  2. Suche: upload_max_filesize
    • Ändere zu: upload_max_filesize = 64M
    • Warum? Damit du auch größere Bilder oder PDFs hochladen kannst.
  3. Suche: post_max_size
    • Ändere zu: post_max_size = 64M
    • Warum? Muss mindestens so groß sein wie der Upload.
  4. Suche: max_execution_time
    • Ändere zu: max_execution_time = 60
    • Warum? Gibt komplexen Skripten etwas mehr Zeit, bevor sie abgebrochen werden.
  5. Der Opcache-Turbo: Suche nach [opcache]. Entferne das Semikolon ; am Anfang der Zeilen, um sie zu aktivieren, und setze diese Werte:opcache.enable=1 opcache.memory_consumption=256 opcache.max_accelerated_files=20000 opcache.revalidate_freq=0
    • Was passiert hier? Opcache speichert vorkompilierten Code im RAM. PHP muss Skripte nicht bei jedem Klick neu lesen. revalidate_freq=0 bedeutet: Prüfe immer sofort, ob sich Dateien geändert haben (wichtig für Entwickler).

Speichere mit STRG + O, Enter und beende mit STRG + X.

Express-Variante für Copy-Paste-Fans: Keine Lust auf Rumklicken in Nano? Geht auch in einem Rutsch auf der Kommandozeile. Diese Befehle finden die Zeile automatisch – egal ob sie schon existiert oder noch mit einem Semikolon auskommentiert ist:

sudo sed -i 's/^memory_limit = .*/memory_limit = 512M/' /etc/php/8.5/fpm/php.ini
sudo sed -i 's/^;\\?opcache\\.memory_consumption[[:space:]]*=.*/opcache.memory_consumption=256/' /etc/php/8.5/fpm/php.ini
sudo sed -i 's/^;\\?opcache\\.max_accelerated_files[[:space:]]*=.*/opcache.max_accelerated_files=20000/' /etc/php/8.5/fpm/php.ini
sudo sed -i 's/^;\\?opcache\\.revalidate_freq[[:space:]]*=.*/opcache.revalidate_freq=0/' /etc/php/8.5/fpm/php.ini
sudo systemctl restart php8.5-fpm

Kurzer Check, ob die Brigade die neuen Werte wirklich übernommen hat:

sudo php -c /etc/php/8.5/fpm -i | grep -E "^(memory_limit|opcache\.(memory_consumption|max_accelerated_files|revalidate_freq))"

Steht dort 

memory_limit => 512M => 512M
opcache.max_accelerated_files => 20000 => 20000
opcache.memory_consumption => 256 => 256
opcache.revalidate_freq => 0 => 0

hat die Küchenbrigade übernommen. 🎉

Hochzeit (Apache & PHP verbinden)

Der Kellner (Apache) und der Koch (PHP-FPM) arbeiten standardmäßig noch nicht zusammen. Wir müssen Apache sagen: "Alles, was auf .php endet, gibst du bitte an die FPM-Brigade weiter."

sudo a2enmod proxy_fcgi setenvif sudo a2enconf php8.5-fpm

Und jetzt starten wir beide neu, damit sie sich kennenlernen:

sudo systemctl restart apache2 php8.5-fpm

Der Geschmackstest

Läuft die Küche wirklich? Wir testen das mit einer kleinen Info-Datei.

Erstelle eine Datei im Web-Ordner:

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php

Öffne deinen Browser und rufe auf: http://DEINE-SERVER-IP/info.php

Siehst du eine lila-graue Tabelle mit dem großen Logo PHP Version 8.5...? Scrolle runter. Steht bei memory_limit jetzt 512M?

Perfekt! 🎉 Dein Server hat jetzt Gehirn-Power.

⚠️ Sicherheits-Sherpa-Hinweis: Diese Datei verrät Hackern alles über deinen Server. Lösche sie sofort wieder:

sudo rm /var/www/html/info.php

Was haben wir erreicht?

Du hast jetzt einen Webserver, der nicht nur HTML ausliefert, sondern echte Anwendungen berechnen kann. Und zwar mit 512 MB RAM und Opcache. Das ist schneller als 90% der Shared-Hosting-Pakete da draußen.

Aber ein Gehirn ohne Gedächtnis ist vergesslich. PHP vergisst alles, sobald die Seite fertig geladen ist. Wir brauchen ein Langzeitgedächtnis - und zwar gleich zwei: eines für Drupal, eines für AI.

Bereit für MariaDB und PostgreSQL?