PHP in der Webhosting-Umgebung

PHP and an optional MySQL database are available in the LRZ web hosting environment.  This enables the operation of many web applications. This pages explains technical background and provides tipps for working with specific versions.

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:

PHP execution

In our infrastructure, PHP is executed via the FastCGI Process Manager (PHP FPM), making your website's PHP processes run with the privileges of your website's functional account.

Available PHP versions

We usually provide more than one PHP version at a time. The current default PHP version will be used for a new website.

You may choose to use a different version than the default one. Please contact the LRZ web hosting team to change your website's PHP version.

Please note

Each major version of PHP, like 7.3 or 7.4, is supported by the PHP development team for two years (see "Supported Versions").

As soon as a major release reaches its end of life (EOL) and no longer receives security updates, we will also no longer be able to provide support for that PHP version to avoid security risks. This means that we will upgrade websites in our hosting running the PHP version that is falling out of support to the next higher major version (e.g. from PHP 7.3 to 7.4). This action usually happens in early December each year. As part of this, you must ensure that your web application is compatible with the next higher PHP version. If you use a CMS such as TYPO3 or Wordpress, you can usually find compatibility information in the system requirements.

We will inform you about an upcoming change in our supported PHP versions several weeks in advance.

In cases where a non-default PHP version was configured for the website (for example, if you use a very recent PHP version), your website's PHP version will not be changed automatically.

PHP extensions

A range of PHP extensions/libraries are available in our infrastructure, e.g. gd (graphics library), ftps, imap, intl, ldap, mbstring or mcrypt. Due to the maintenance aspect and our limited person power, we will usually not be able to provide more extensions. Please contact us if there is a certain extension that you need and we will consider if we can provide it. The same applies to the customisation of PHP parameters.

Using PHP on the command line and in cron jobs

On the access servers, PHP is available for use on the command-line and in cron jobs. The php command executes the most recent installed version of PHP that is configured for your website. You can find out the exact version with the -v flag. The following shows an example where PHP 7.4 is configured for the site. PHP is executed in version 7.4.11 ("11" is the patch level version).

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

However, the PHP version that is executed via the php command may change due to updates (see the information box under "Available PHP versions"). Therefore, we provide a dedicated command for each major PHP version, like for example php7.4 (see below for more information).

Tip

The configuration of your website determines which major PHP version your website uses (see above).

To avoid errors in the execution of your web application, you should also use this major PHP version on the command line or in cron jobs or other scripts.  Therefore, it is recommended to use the version-specific PHP command (see below) to avoid unexpected version jumps.

There are various ways to find out which PHP versions are installed and what the commands are called:

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

Notes:

  • You can find the PHP commands in the /bin directory as well as under /usr/bin.
  • The PHP commands in /bin and /usr/bin are identical.
  • Usually, /bin and /usr/bin are included in the command search path (meaning both directories are contained in the $PATH environment variable, which you can check by running the command echo $PATH). This means that you can simply use the command without using the whole path (for example, php7.4 instead of /usr/bin/php7.4).

Tip

Cron jobs are executed in a separate environment where the command search path is different from the interactive shell. When writing cron jobs, you should therefore do the following to avoid problems:

  • Use absolute paths for commands (for example, use /usr/bin/php7.4 instead of php7.4).
  • If your cron job executes a shell script, you should set the $PATH environment variable explicitly at the start of the script.

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.