PHP 5.2 auf Debian Wheezy

Ich sollte einige Veränderungen an einer bestehenden Software eines Dienstleisters vornehmen. Nichts wildes, nur ein paar Kleinigkeiten.
Also den Source geholt und erstmal ansehen wie der arbeitet… leider war das leichter gesagt als getan! Mein Devel-Server läuft mit Debian Wheezy und da ist, oh wunder, PHP 5.3 mitgeliefert.
Eigentlich nicht tragisch, würde diese Software daran nicht scheitern. Herauszufinden das die PHP 5.2 braucht hat schon etwas gedauert, da die Fehlermeldungen kryptisch waren und Fehler aufzeigten die es im Code so gar nicht gab.
Nun gut, nachdem klar war das diese Software nur unter 5.2 läuft, stellte sich die Frage, was tun? Mit zwei Virtuellen Maschinen will ich eigentlich nicht hantieren…
Also muss PHP 5.2 neben 5.3 installiert werden, auf der gleichen Maschine!
Gut, ein wenig googlen später hatte ich einen vielversprechenden Link gefunden: http://davejamesmiller.com/blog/how-to-install-php-5.2-fastcgi-on-debian-6.0-squeeze
Das deckt eigentlich komplett ab was ich brauche!
Leider traten natürlich Fehler auf, aber auch dafür fand sich Hilfe: http://zgadzaj.com/how-to-install-php-53-and-52-together-on-ubuntu-1204

Beide Links zusammen ergeben genau das was ich will: Eine komplett getrennte PHP-Installation, die mein restliches System in Ruhe lässt!

Das Ganze lässt sich in folgenden Schritten erledigen:

Erstmal FastCGI für Apache installieren/aktivieren:

apt-get install libapache2-mod-fastcgi
a2enmod actions fastcgi

PHP runterladen und auspacken:

mkdir -p ~/php-build
cd ~/php-build
wget http://museum.php.net/php5/php-5.2.17.tar.gz
tar zxf php-5.2.17.tar.gz
cd ~/php-build/php-5.2.17/

Zum Bauen notwendige Libs installieren:

apt-get build-dep php5
apt-get install libfcgi-dev libmhash-dev

Ich hatte das Problem, das beim Bauen dann folgender Fehler auftrat:

ext/openssl/.libs/xp_ssl.o: In function `php_openssl_setup_crypto‘:
ext/openssl/xp_ssl.c:357: undefined reference to `SSLv2_server_method‘
ext/openssl/xp_ssl.c:337: undefined reference to `SSLv2_client_method‘

Das ist wohl ein bekannter PHP-Bug: #54736
Lösung: Patch ins Bau-Verzeichnis herunterladen
und per

patch -p1 < debian_patches_disable_SSLv2_for_openssl_1_0_0.patch.patch

anwenden.

Jetzt können wir konfigurieren:

./configure \
–prefix=/opt/php52 \
–enable-force-cgi-redirect \
–enable-fastcgi \
–with-regex=php \
–enable-calendar \
–enable-sysvsem \
–enable-sysvshm \
–enable-sysvmsg \
–enable-bcmath \
–with-bz2 \
–enable-ctype \
–with-iconv \
–enable-exif \
–enable-ftp \
–with-gettext \
–enable-mbstring \
–with-pcre-regex \
–enable-shmop \
–enable-sockets \
–enable-wddx \
–with-libxml-dir=/usr \
–with-zlib \
–with-openssl=/usr \
–enable-soap \
–enable-zip \
–with-mhash=yes \
–with-gd \
–with-mysql \
–with-mysqli \
–with-pdo-mysql \
–with-pear \
–with-jpeg-dir=/usr/lib \
–enable-gd-native-ttf \
–with-ttf \
–with-freetype-dir=/usr \
–with-libdir=/lib/i386-linux-gnu/

Die letzte Zeile habe ich benötigt, da sonst configure mit

configure: error: Cannot find OpenSSL’s libraries

abbricht.
Der Pfad ist nicht immer gleich, unter 64bit-Systemen wäre er

/lib/x86_64-linux-gnu

Einfach ins /lib-Verzeichnis schauen, sollte immer mit linux-gnu enden.
Die prefix-Anweisung oben sagt, wohin nachher installiert werden soll, einfach nach gutdünken anpassen. /opt ist unter Linux aber eine gute Wahl.

Jetzt ist fast alles fertig, nun kommt der Teil der etwas dauert und ganz unspektakulär anfängt:

make

Damit wird jetzt wirklich kompiliert und ausführbare Dateien erzeugt.

Wenn das dann hoffentlich erfolgreich abgeschlossen ist, kann man noch

make test

machen, damit werden alle verfügbaren Test ausgeführt und geprüft ob fehlerfrei kompiliert wurde.
Hat bei mir einen Fehler gehabt, hab ich ignoriert. 😉

Installation ist wieder einfach:

make install

und fertig.

Jetzt hat man unter /opt/php52 eine Installation von PHP 5.2, kann man testen indem man

/opt/php52/bin/php -v

ausführt und schaut, was da für eine Version angezeigt wird.

Nun die Integration in Apache:

mkdir /var/www/cgi-bin
chmod o+rX /var/www/cgi-bin/
cd /var/www/cgi-bin

Dort eine Datei „php52.fcgi“ anlegen mit folgendem Inhalt:

#!/bin/sh
export PHP_FCGI_CHILDREN=4
export PHP_FCGI_MAX_REQUESTS=200
export PHPRC=“/opt/php52/etc/php.ini“
exec /opt/php52/bin/php-cgi

Die php.ini gibt es nicht, man kann sie aber anlegen, falls man sie braucht.

Die Datei ausführbar machen:

chmod a+rx /var/www/cgi-bin/php52.fcgi

Ich benutze einenen eigenen VHost für diese eine Applikation, bei diesem nun mit hinein:

# Use FastCGI version of PHP
php_admin_flag engine off
ScriptAlias /cgi-bin /var/www/cgi-bin
Action application/x-httpd-php /cgi-bin/php52.fcgi

Apache nun neu starten:

/etc/init.d/apache2 restart

Und fertig, nach Aufruf der Domain funktioniert die App nun endlich wie sie soll auch auf meinem Devel-Rechner!

Kurze Worte der Warnung:
PHP 5.2 wird nicht mehr unterstützt, die letzte Version ist von Anfang 2011.
Wer jetzt das noch produktiv nutzt, ist selber Schuld. Leider gibt es ab und zu Gründe die einen zwingen, so wie hier.
Ob meine Lösung sinnvoll für einen produktiven Betrieb ist, weiß ich nicht, ich habe das nur für meine Devel-Maschine benötigt.