Artikel
von Patrick Froch
In diesem Artikel wird beschrieben, wie man mehrere PHP-Versionen mit phpfarm und Apache 2.4 auf Ubuntu 14.10 betreibt. Die Auswahl einer PHP-Version geschieht dabei am Ende einfach über einen Eintrag in der .htaccess.
Für dieses Tutorial sind ausgeprägte Linux-Kenntnisse von Vorteil!

Installation der nötigen Komponenten

Zunächst werden die Build-Tools installiert. Diese sind nötig, um Programme kompilieren zu können.
user@host:~$ sudo apt-get build-essential
Damit man die PHP-Versionen erstellen kann, müssen ein paar Abhängigkeiten installiert werden. Dies geht am einfachsten mit folgendem Befehl:
user@host:~$ sudo apt-get build-dep php5
Für das hier gezeigte Setup sind noch weitere Pakete erforderlich. Es handelt sich um eine gute Grundkonfiguration, die den meisten Ansprüchen genügen sollte. Wenn unter "Build-Prozess der PHP-Versionen konfigurieren" andere Einstellungen verwendet werden, sind ggf. hier auch andere Pakete nötig.
user@host:~$ sudo apt-get install mcrypt libmcrypt4 libmcrypt-dev libreadline-dev libc-client2007e
user@host:~$ sudo apt-get install libfreetype6 libfreetype6-dev libpng12-0 libpng12-dev libjpeg-dev 
user@host:~$ sudo apt-get install libjpeg8-dev libjpeg8  libgd-dev libgd3 libxpm4 libltdl7 libltdl-dev
Als letztes wird phpfarm installiert. In diesem Artikel wird als Speicherort /usr/local/bin/phpfarm gewählt. Oft wird auch /opt/phpfarm verwendet.
user@host:~$ sudo git clone https://github.com/cweiske/phpfarm.git /usr/local/bin/phpfarm

Apache konfigurieren

Damit Apache nachher die installierten PHP-Versionen auch nutzen kann, müssen erst einige Module installiert und aktiviert werden.
user@host:~$ sudo apt-get install libapache2-mod-fastcgi apache2-mpm-worker apache2-suexec php5-fpm
user@host:~$ sudo a2enmod fastcgi actions suexec
Jetzt wird die Konfiguration des Apache unter /etc/apache2/sites-enabled/000-default.conf wie folgt angepasst. In Zeile 6 wird ein extra Verzeichnis für zusätzliche Konfigurationsdateien angegeben. Dort werden später die Einstellungen der FastCGI-Server für jede Version gespeichert. Da alle *.conf-Dateien aus diesem Verzeichnis eingelesen werden, muss nach der Installation einer PHP-Version nur der Apache neu gestartet werden. Es sind keine weiteren Konfigurationen am Apache selber nötig! Die Zeile 20 kann später durch Einstellungen in der .htaccess überschrieben werden. So kann dann pro vHost die PHP-Version eingestellt werden.

Build-Prozess der PHP-Versionen konfigurieren

Damit PHP den meisten grundlegenden Bedürfnissen genügt, wird folgende Konfiguration vorgeschlagen. Sie wird unter /usr/local/bin/phpfarm/src/custom-options.sh gespeichert. Nun werden noch einige Standardeinstellungen getätigt, die für alle erstellten PHP-Versionen gelten. Sie werden unter /usr/local/bin/phpfarm/src/custom-php.ini gespeichert.

FastCGI

Erstellen des FastCGI-Wrappers

An dieser Stelle greife ich etwas vor und erstelle ein Skript, welches später für das Delegieren der Anfragen zuständig ist. Dies hat den Vorteil, dass der Erstellungsprozess einer PHP-Version später zusammenhängend erläutert werden kann.
Das Skript macht zwei Dinge: zuerst versucht es aus dem eigenen Dateinamen eine Version auszulesen. Wenn dies gelingt, wird die Anfrage an die entsprechende PHP-Version weitergeleitet. Heißt die Datei z.B. php-cgi-5.5.0, so wird die Anfrage an den Interpreter der Version 5.5.0 weitergeleitet. Wenn keine entsprechende Version gefunden wird, oder der Name der Datei php-cgi-current lautet, wird die höchstmögliche Version benutzt. Um die FastCGI-Wrapper zentral speichern zu können, wird der Ordner /usr/local/bin/phpfarm/bin erstellt:
user@host:~$ sudo mkidr /usr/local/bin/phpfarm/bin
Nun wird die "Fallback"-Datei unter dem Namen /usr/local/bin/phpfarm/inst/php-cgi-current erstellt. Sie wird immer dann verwendet, wenn kein Eintrag in der jeweiligen .htaccess vorhanden ist. Nun muss die Datei ausführbar gemacht werden:
user@host:~$ sudo chmod +x /usr/local/bin/phpfarm/bin/php-cgi-current
Für alle neuen PHP-Versionen wird einfach die Datei kopiert und die Versionsnummer in den Dateinamen geschrieben. Für die Version 5.5.20 wird die Datei von php-cgi-current nach php-cgi-5.5.20 kopiert. Das Skript liest die Version dann aus dem Dateinamen aus und ruft die entsprechende PHP-Version auf.

Konfiguration der FastCGI-Server

Wie bereits unter "Apache konfigurieren" erwähnt wurde, sollen die Konfigurationen der FastCGI-Server in einem seperaten Verzeichnis gespeichert werden. Dies wird nun erstellt:
user@host:~$ sudo mkidr /usr/local/bin/phpfarm/conf
Wie die Konfigurationen aussehen, wird im nächsten Abschnitt erläutert.

Erstellen der ersten PHP-Version

Nun sind die Vorbereitungen abgeschlossen und es ist an der Zeit die erste PHP-Version zu installieren. Als Beispiel wird hier die Version 5.4.38 installiert.

Kompilieren der Version

user@host:~$ cd /usr/local/bin/phpfarm/src
user@host:~$ ./compile 5.4.38

Erstellen des FastCGI-Wrappers

user@host:~$ sudo cp /usr/local/bin/phpfarm/bin/php-cgi-current /usr/local/bin/phpfarm/bin/php-cgi-5.4.38
user@host:~$ sudo chmod +x /usr/local/bin/phpfarm/bin/php-cgi-5.4.38

Konfiguration des FastCGI-Servers

Die Konfiguration wird nun in dem unter FastCGI > Konfiguration der FastCGI-Server erstellten Verzeichnis gespeichert und zwar in der Datei /usr/local/bin/phpfarm/conf/php-5.4.38.conf.
Update: 14.06.2015
Damit man nicht ständig in die FastCGI-Idle-Time läuft und einen Error 500 erhält, sollte an die oben stehende Zeile folgendes anzuhängen werden: -idle-timeout 300.

Services neu starten

Nun muss noch der Apache-Server und die PHP-Prozesse neu gestartet werden.
user@host:~$ sudo service apache2 restart
user@host:~$ sudo service php5-fpm restart

Wahl der PHP-Version

Hat man nun mehrere Versionen installiert und möchte für einen vHost eine bestimmte auswählen, reicht folgender Eintrag am Ende der entsprechenden .htaccess: Hier wird als Beispiel auf die Version 5.5.0 umgestellt. Diese müsste natürlich installiert sein, damit es funktioniert. Aber dies sollte jetzt ja kein Problem mehr sein.

Zurück

Kommentare

Aufgrund der unklaren Rechtslage durch die DSGV habe ich mich entschlossen, die Kommentare bis auf Weiteres zu deaktivieren.