PHP in der Webhosting-Umgebung

In der Webhosting-Umgebung des LRZ stehen PHP und eine optionale MySQL-Datenbank zur Verfügung.  Dies emöglicht den Betrieb von vielen Web-Anwendungen. Diese Seite erklärt die technischen Hintergründe und gibt Tipps für die Arbeit mit den jeweiligen Versionen.

Anbindung

Die Anbindung von PHP erfolgt mit Hilfe von PHP-FPM. Dadurch laufen die PHP-Prozesse Ihrer Website mit den Rechten der Funktionskennung Ihrer Website.

Verfügbare PHP-Versionen

In der Infrastruktur des LRZ-Webhosting stehen normalerweise mehrere PHP-Versionen zur Verfügung. Eine der verfügbaren Versionen ist jeweils voreingestellt. Beim Einrichten einer neuen Website wird diese Voreinstellung für Ihre Website konfiguriert.

Sie können frei eine andere der zur Verfügung stehenden Versionen wählen. Leider können Sie die dazu erforderliche Konfigurationsänderung nicht selbst durchführen. Kontaktieren Sie zur Änderung bitte das Webhosting-Team mit Hilfe eines authentifizierten Incident: Variante "Selfservice" (d.h. mit Login) beim Webformular für den Servicedesk.

Hinweis

Das PHP-Entwicklungsteam unterstützt einen Major Release wie PHP 7.3 oder 7.4 nur zwei Jahre lang (siehe "Supported Versions").

Wenn ein Major Release keine Sicherheitsaktualisierungen mehr erhält, werden auch wir für diese PHP-Version keine Unterstützung mehr anbieten können, um Sicherheitsrisiken zu vermeiden. Dies bedeutet, dass wir Websites in unserem Hosting, die mit der aus dem Support fallenden PHP-Version laufen, auf die nächsthöhere Major-Version anheben werden (z.B. von PHP 7.3 auf 7.4). Diese Aktion geschieht normalerweise Anfang Dezember jedes Jahres. In diesem Zuge müssen Sie dafür Sorge tragen, dass Ihre Webapplikation mit der nächsthöheren PHP-Version kompatibel ist. Wenn Sie ein CMS wie TYPO3 oder Wordpress nutzen, finden Sie Informationen zur Kompatibilität normalerweise in den Systemanforderungen.

Wenn eine PHP-Umstellung ansteht, werden wir Sie zeitnah (i.d.R. mit mehreren Wochen Vorlauf) darüber informieren.

In Fällen, in denen eine andere als die Standard-PHP-Version für die Website konfiguriert wurde (z. B. wenn Sie eine sehr aktuelle PHP-Version verwenden), wird die PHP-Version Ihrer Website nicht automatisch geändert.

PHP-Erweiterungen

Neben dem PHP-Kern stellen wir eine Reihe von Erweiterungen/Bibliotheken zur Verfügung, wie z.B. gd (Grafik-Bibliothek), ftps, imap, intl, ldap, mbstring oder mcrypt.  Wegen des Pflegeaufwands können wir weitere Bibliotheken nur in einem sehr begrenzten Umfang zur Verfügung stellen. Wenden Sie sich bitte an das Webhosting-Team, falls Sie etwas vermissen. Analoges gilt für die Anpassung von PHP-Parametern.

PHP auf der Kommandozeile und in Cron-Jobs

Auf dem Zugangsrechner steht PHP auch auf der Kommandozeile und für Cron-Jobs zur Verfügung. Das Standard-Kommando php führt PHP in der aktuell für Ihre Website eingestellten Version aus. Diese Version kann man mit Hilfe der Option -v ermitteln. Beim unten gezeigten Beispiel ist PHP 7.4 für die Website konfiguriert und wird mit der Patchversion 11 (3. Abschnitt der Versionsnummer) ausgeführt:

user@webdev02:~$ php  -v
PHP 7.4.11 (cli) (built: Oct 8 2020 17:32:43) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.11, Copyright (c), by Zend Technologies

Die PHP-Version, die Sie mit dem Kommando php ausführen, kann sich updatebedingt allerdings ändern (siehe Hinweiskasten unter "Verfügbare PHP-Versionen"). Deshalb stellen wir für jede Major-PHP-Version ein versionsspezifisches Kommando wie z.B. php7.4 zur Verfügung (s.u).

Tipp

Die Konfiguration Ihrer Website bestimmt, welche Major-PHP-Version Ihre Website nutzt (s.o.).

Um Probleme bei der Ausführung Ihrer Webanwendung zu vermeiden, sollte man diese Major-PHP-Version auch auf der Kommandozeile oder in Cron-Jobs oder anderen Skripten verwenden. Deshalb sollte man auf das allgemeine Kommando php verzichten und das passende versions-spezifische PHP-Kommando verwenden (s.u.), um unerwartete Versionssprünge zu vermeiden.

Es gibt mehrere Methoden, wie man herausfinden kann, welche PHP-Versionen installiert sind und wie die spezifischen PHP-Kommandos heißen:

user@webdev02:~$ update-alternatives --list php
/usr/bin/php7.1
/usr/bin/php7.2
/usr/bin/php7.3
/usr/bin/php7.4
/usr/bin/php8.0

user@webdev02:~$ ls /usr/bin/php*
/usr/bin/php  /usr/bin/php7.1  /usr/bin/php7.2	/usr/bin/php7.3  /usr/bin/php7.4  /usr/bin/php8.0

user@webdev02:~$ ls /bin/php*
/bin/php  /bin/php7.1  /bin/php7.2  /bin/php7.3  /bin/php7.4  /bin/php8.0

Anmerkungen:

  • Die PHP-Kommandos sind sowohl im Verzeichnis /bin als auch im Verzeichnis /usr/bin installiert.
  • Die Varianten der PHP-Kommandos in /bin und /usr/bin sind identisch.
  • Normalerweise sind /bin und /usr/bin im Kommando-Suchpfad enthalten (d.h., beide Verzeichnisse kommen in der Environment-Variable $PATH vor; dies können Sie mit dem Kommando echo $PATH überprüfen). Man kann deshalb meist auf die Angabe des absoluten Pfads verzichten und einfach nur das Kommando angeben (z.B. php oder php7.4).

Tipp

Cron-Jobs laufen in einer eigenen Umgebung ab. In dieser Umgebung ist z.B. der Kommando-Suchpfad anders gesetzt als beim Arbeiten mit einer interaktiven Shell. Sie sollten deshalb zur Vermeidung von Problemen folgendes tun:

  • Verwenden Sie absolute Kommando-Pfade bei der Definition des Cron-Jobs.
  • Wenn der Cron-Job ein Shell-Skript aufruft, sollten Sie am Anfang des Skripts den Kommando-Suchpfad explizit setzen (d.h. die Environment-Variable $PATH).

Mögliche PHP-Anwendungen

In der Webhosting-Umgebung des LRZ können alle PHP-Anwendungen betrieben werden, für die die installierten PHP-Komponenten (s.u.) ausreichen.  Dazu gehören u.a. die folgenden Web-Anwendungen:

Falls die von Ihnen gesuchte PHP-Anwendung nicht zu diesen Beispielen gehört, gehen Sie bitte folgendermaßen vor:

Verfügbare PHP-Komponenten

Die PHP-Umgebung besteht aus mehreren Komponenten:

  • Interpreter für die Script-Sprache "PHP".
    Die PHP-Scripts werden mit den Rechten der Funktionskennung ausgeführt, mit der die Website gesteuert wird.
  • Funktionale Erweiterungen/Bibliotheken.
    Beispiele:  "ftps",  "gd" (Grafik-Bibliothek),  "imap",  "intl",  "ldap",  "mbstring",  "mcrypt"
  • Composer (anwendungsorientierter Paketmanager für PHP) auf dem Zugangs-Rechner.
  • Sonstige SW-Pakete, die von den obigen Komponenten benötigt werden.

Weitere Komponenten kann das LRZ wegen des Pflegeaufwands leider nur in einem sehr begrenzten Umfang zur Verfügung stellen.  Wenden Sie sich bitte an das Webhosting-Team, falls Sie etwas vermissen.
Analoges gilt für die Anpassung von PHP-Parametern.

Im Augenblick (Stand Januar 2024) stehen passende Komponenten für die folgenden PHP-Branches (s.u.) zur Verfügung:  PHP-8.0,  PHP-8.1,  PHP-8.2

PHP-Branch der eigenen Website

Vom PHP-Entwicklungsteam bzw. von Debian werden mehrere PHP-Branches (Major-Versionen) gleichzeitig unterstützt.  Für diese "aktiven" Branches gibt es zumindest Updates zur Beseitigung von neu entdeckten Sicherheitslücken.  In der Webhosting-Umgebung des LRZ stehen mehrere aktive PHP-Branches gleichzeitig zur Verfügung.

Das Webhosting-Team kann durch eine geeignete Konfiguration für jede Website individuell festlegen, welche der gerade installierten PHP-Branches gelten soll.  Daneben gibt es einen Default-Branch für alle Websites, bei denen kein Branch individuell konfiguriert ist.

Welcher PHP-Branch für eine Website gilt, wird nach den folgenden Regeln bestimmt:

  • Bei der Website ist der Branch "X.Y" individuell konfiguriert und "X.Y" gehört zu den installierten Branches:
    Die Website wird mit dem Branch "X.Y" betrieben.
  • Andernfalls:
    Die Website wird mit dem Default-Branch für die jeweilge Umgebung betrieben. 

Hinweis zum Default-Branch

In der PHP-Umgebung wird der Default-Branch regelmäßig an die Weiterentwicklung von PHP angepasst (siehe bei PHP die Übersicht "Supported Versions").  Der Update auf den nächsthöheren Branch erfolgt normalerweise einmal pro Jahr nach einer entsprechenden Vorankündigung (meist Anfang Dezember).

Wenn Ihre Website mit dem Default-Branch betrieben wird (s.o.), sorgen Sie bitte rechtzeitig vor dem jährlichen Update, dass Ihre Web-Anwendungen mit dem nächsthöheren Branch kompatibel sind.  Bei vielen Web-Anwendungen findet man Hinweise zur Kompatibilität in den Systemanforderungen.

Außerdem findet man im Anhang des PHP-Handbuchs Hinweise zur Migration von einem PHP-Branch zum nächsthöheren.

Wenn bei Ihrer Website ein PHP-Branch individuell konfiguriert werden soll bzw. die bestehende Konfiguration geändert werden soll, erteilen Sie bitte dem Webhosting-Team einen entsprechenden Auftrag:

  • Was soll genau gemacht werden?
  • Wann soll die Konfigurationsänderung durchgeführt werden?
    • Sie können mit uns einen Termin oder ein Zeitfenster vereinbaren.
    • Sie teilen uns mit, dass die Änderung ab sofort oder ab einem bestimmten Termin stattfinden kann.

Nach der Änderung testen wir stichprobenartig, ob noch alles funktioniert.  Dabei hoffen wir auf Ihr Verständnis:

  • Wegen fehlender PersonPower können unsere Tests nur sehr rudimentär sein, d.h. wir können nur ein paar Seiten anklicken.

  • Aus technischen Gründen können wir prinzipiell nicht beurteilen, ob wirklich alles noch funktioniert.

Im Fehlerfall nehmen wir die Änderung sofort zurück.  Wir informieren Sie in jedem Fall über den Ausgang.

Tipps zu PHP auf der Kommandozeile

Auf dem Zugangs-Rechner steht PHP auch auf der Kommandozeile zur Verfügung:

  • Bei interaktiven Arbeiten
  • Bei Cron-Jobs

Tipps zu Cron-Jobs

Cron-Jobs laufen in einer eigenen Umgebung ab.  In dieser Umgebung ist z.B. der Kommando-Suchpfad meist anders gesetzt als beim Arbeiten mit einer interaktiven Shell.  Deshalb sollte man zur Vermeidung von Problemen folgendes tun:

  • Verwendung von absoluten Kommando-Pfaden bei der Definition des Cron-Jobs.
  • Wenn bei der Definition des Cron-Jobs ein Shell-Script aufgerufen wird, sollte man am Anfang des Scripts den Kommando-Suchpfad explizit setzen (d.h. die Environment-Variable "$PATH").


Verfügbare PHP-Branches

Es gibt mehrere Methoden, wie man herausfinden kann, welche PHP-Branches in der Webhosting-Umgebung des LRZ zur Verfügung stehen.  Dabei findet man auch gleichzeitig heraus, wie der spezifische PHP-Interpreter für die Kommandozeile heißt.

Man loggt sich auf dem Zugangs-Rechner mit der Funktionskennung interaktiv ein und gibt dann auf der Kommandozeile eines der folgenden Kommandos (Stand Januar 2024).

Installierte PHP-Branches
user@webdev02:~ $ update-alternatives  --list  php
[...]
/usr/bin/php8.0
/usr/bin/php8.1
/usr/bin/php8.2


user@webdev02:~ $ ls  /usr/bin/php*
/usr/bin/php  [...]  /usr/bin/php8.0  /usr/bin/php8.1  /usr/bin/php8.2

user@webdev02:~ $ ls  /bin/php*
/bin/php  [...]  /bin/php8.0  /bin/php8.1  /bin/php8.2

Anmerkungen:

  • Die ls-Kommandos mit den Pattern  "/usr/bin/php*" und "/bin/php*" liefern die selbe Liste von Kommandos, weil es sich bei "/usr/bin" und "/bin" um das selbe Verzeichnis handelt:  "/bin" ist nämlich kein eigenes Verzeichnis, sondern ein Symbolic-Link (Softlink) auf das Verzeichnis "/usr/bin".
  • Normalerweise sind "/usr/bin" und/oder "/bin" im Kommando-Suchpfad enthalten, d.h. die Strings kommen in der Environment-Variable "$PATH" vor.  Man kann dies mit dem Kommando "echo $PATH" überprüfen.
    Deshalb kann man meist auf die Angabe eines absoluten Pfades verzichten und nur den Kommandonamen angeben (z.B. "php" oder "php8.2").
  • Das Kommando mit dem Namen "php" (d.h. ohne eine Versionsnummer) ist der PHP-Interpreter für den aktuellen Default-Branch.
    Achtung:  Da sich der Default-Branch regelmäßig ändert, ändert sich "php" entsprechend.
  • Die Kommandos mit dem Namen "php<Versionsnummer>" sind Interpreter für einen spezifischen Branch, der im Laufe der Zeit gleich bleibt.
    Bei diesen Kommandos ändert sich nur gelegentlich die Minor-Version (wie z.B. von "8.2.11" auf "8.2.12").  Dies beeinträchtigt aber nicht die Lauffähigkeit von PHP-Scripts.

Mit der Option "–-version" (bzw. "-v") erhält man beim PHP-Interpreter u.a. den Branch und die Minor-Version.

Genaue Version des PHP-Interpreters
user@webdev02:~ $ php  --version
PHP 8.1.23 (cli) (built: Oct  6 2023 10:11:51) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.23, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.23, Copyright (c), by Zend Technologies


user@webdev02:~ $ php8.2  --version
PHP 8.2.11 (cli) (built: Oct  6 2023 10:11:52) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.11, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.11, Copyright (c), by Zend Technologies


Spezifischen PHP-Branch nutzen

Der PHP-Branch für den eigenen Webauftritt wird durch den Default-Branch bzw. durch eine individuelle Konfiguration festgelegt.  Manchmal benötigt man auf dem Zugangs-Rechner aber auch den PHP-Interpreter auf der Kommandozeile:

  • Das verwendete CMS oder der PHP-Composer erfordert die Ausführung eines PHP-Scripts.
  • In einem Cron-Job wird ein PHP-Script benötigt.

Tipp zum PHP-Branch

Zur Vermeidung von Problemen verwendet man normalerweise auch auf der Kommandozeile denjenigen PHP-Branch, der beim Webauftritt eingesetzt wird.

Falls man einen spezifischen PHP-Branch benötigt, können im Zusammenhang mit dem Kommando "php" (Interpreter für den Default-Branch) zwei Probleme auftreten:

  • Selbst wenn "php" im Augenblick der Interpreter für den benötigten Branch ist, ändert sich dies im Laufe der Zeit.
    Deshalb steht für jeden verfügbaren Branch ein spezifisches Interpreter-Kommando zur Verfügung (wie z.B. "php8.2"), das man dann auch verwenden sollte.
  • Manchmal kann man den benötigten spezifischen Interpreter nicht direkt aufrufen.
    Dies kann z.B. bei der Initialisierung eines CMS geschehen:  Bei der Initialsierung muss man ein Setup-Script ausführen, das dann "im Inneren" den PHP-Interpreter mit dem Pfad "php" startet.  Falls dann der Default-Branch zu alt für das CMS ist, bricht das Setup-Script mit einer Fehlermeldung ab.

Beim zweiten Problem muss man "irgendwie" dafür sorgen, dass mit dem Kommandonamen "php" der "richtige" Interpreter gestartet wird.

Angenommen, man benötigt den PHP-Branch "8.2" und die Funktionskennung der eigenen Website arbeitet mit "bash" als Shell.  In diesem Fall sollte die folgende Vorgehensweise funktionieren.

Neues Kommando "php"

Man erstellt ein "neues" Kommando "php", mit dem "php8.2" gestartet wird.

Erzeugung des neuen "php"
# Erzeugen der erforderlichen Verzeichnisse.
mkdir  --parents  --mode=02700  --verbose  $HOME/bin/Overlay

# Nach ".../Overlay" wechseln.
cd  $HOME/bin/Overlay

# Erzeugen eines Symbolic-Link zum gewünschten Branch-Kommando.
ln  --symbolic  --verbose  /usr/bin/php8.2  php

# Test, ob das neue "php" auch wirklich funktioniert.
./php  --version

Der Verzeichnisname "Overlay" ist nur ein Vorschlag;  er soll daran erinnern, dass die Kommandos in diesem Verzeichnis gleichnamige Kommandos in System-Verzeichnissen "überlagern" sollen.  Deshalb sollte man sich auch genau überlegen, welche Kommandos man in ".../Overlay" anlegt.

"Overlay" an den Anfang des Kommando-Suchpfades

Man sorgt dafür, dass sich das Verzeichnis "$HOME/bin/Overlay" ganz am Anfang des Kommando-Suchpfades (Variable "$PATH") befindet.

Die Modifikation von "$PATH" muss aber automatisch erfolgen:

  • Beim Einloggen
  • Beim Starten eines bash-Scripts

Dazu nutzt man aus, dass die Shell "bash" gleich mehrere Profile-Dateien besitzt.  In der man-Page von "bash" findet man im Abschnitt "INVOCATION" den folgenden Abschnitt:

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists.

After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable.

The --noprofile option may be used when the shell is started to inhibit this behavior.

[ Hinweis:  Das Zeichen "Tilde" ("~") ist eine Kurzform für "$HOME". ]

Man erweitert also eine der Dateien "$HOME/.bash_profile", "$HOME/.bash_login" oder "$HOME/.profile" (in dieser Reihenfolge) an "geeigneter" Stelle.
Wenn noch keine dieser Dateien existiert, sollte man "$HOME/.bash_profile" anlegen.

Die betreffende Datei erweitert man um das folgende Kommando:

Erweiterung von "$PATH"
# Achtung: Der Backslash ("\") muss am Zeilenende stehen.

expr  match  "$PATH"  ".*/Overlay:"  > /dev/null \
||  export  PATH="$HOME/bin/Overlay:$PATH"

Durch dieses Kommando erfolgt die Erweiterung von "$PATH" mittels "export PATH=..." nur dann, wenn der String "/Overlay:" noch nicht in "$PATH" vorkommt.
Dadurch kann man das Kommando auch problemlos mehrfach ausführen; der Kommando-Suchpfad wird nur einmal erweitert.
Als Folge kann man das Kommando auch in mehrere Shell-Profiles schreiben (z.B auch in "$HOME/.bashrc").  Dies ist unter bestimmten Umständen evtl. erforderlich (siehe den Abschnitt "INVOCATION" in der man-Page von "bash").

Hinweise bei Verwendung einer anderen Shell:

  • Man muss das profile-System der eigenen Shell nutzen.
  • Man muss das Kommando zur Erweiterung von "$PATH" evtl. an die eigene Shell anpassen.

Erweiterung von "$PATH" in der interaktiven Shell

In der aktuellen interaktiven Shell sollte man auch den Kommando-Suchpfad erweitern:  export  PATH="$HOME/bin/Overlay:$PATH"
Dies ist aber nur einmal erforderlich;  später geschieht dies automatisch beim Anmelden usw.

Jetzt sollte auch das Kommando "php -v" den Branch "8.2" anzeigen.