Kategorien
Allgemein Systemadministration

Finales PHP 7 unter Ubuntu 14.04 LTS als php-fpm Variante testen.

Mit einiger Verzögerung wurde heute am 3. Dezember die finale Version 7.0.0 von PHP veröffentlicht. Eigentlich hätte dies nämlich schon im Oktober geschehen sollen. Offizielle Pakete wird es bei den Linux Distributionen noch nicht so bald geben aber selbst compiliert als php-fpm Modul, lässt sich PHP 7 relativ einfach testen.

PHP 7 ist generell schneller und in vielen Bereich weniger speicherhungrig als noch PHP 5. Dazu gekommen sind einige neue Features wie  Typehints für Rückgabewerte sowie die strikte Behandlung der selben. Einen ternärer Operator der auch auf prüft ob die Variable überhaupt existiert:

echo $_GET["test"] ?? 'test is not set';

Dann gibt es noch den ominösen Spaceship Operator <=> Der zwei Werte vergleicht und je nach dem -1, 0 oder 1 ausgiebt. Dazu noch anonyme Klassen und vieles mehr.

Wer einen Überblick erhalten möchte welche Neuerungen PHP 7 mit sich bringt findet eine anschauliche Auflistung auf der Zend-Homepage: Coolest PHP 7 Features

1. Download des Sourcecodes

Den Sourcecode erhält man aus dem offiziellen Git Repository.

cd /usr/local/src
wget https://github.com/php/php-src/archive/php-7.0.0.tar.gz
tar -jxf php-7.0.0.tar.gz
cd php-src-php-7.0.0

Damit haben wir den Sourcecode heruntergeladen entpackt und sind in das neue Verzeichnis gewechselt.

2. Konfiguration

Um die wichtigsten Bibliotheken zu installieren können wir folgende Kommandos verwenden. Je nach bedarf können hier weitere hinzugefügt werden um diese später mit –enable-featurexzy zu aktivieren.

sudo aptitude build-dep php5
sudo apt-get install libc-client2007e-dev libmcrypt-dev openssl courier-imap libgmp-dev checkinstall

Weil einige Scripte im Git PHP 7 Sourcecode fehlen erstellen wir diese nun:

./buildconf --force

Danach konfigurieren wir den Sourcecode

./configure --prefix=/opt/php7 \
--with-config-file-path=/etc/php7 \
--with-config-file-scan-dir=/etc/php7/conf.d \
--disable-short-tags \
--enable-mbstring \
--enable-zip \
--enable-bcmath \
--enable-pcntl \
--enable-ftp \
--enable-exif \
--enable-calendar \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--enable-wddx \
--with-curl \
--with-mcrypt \
--with-iconv \
--with-gmp \
--with-pspell \
--with-gd \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--with-zlib-dir=/usr \
--with-xpm-dir=/usr \
--with-freetype-dir=/usr \
--enable-gd-native-ttf \
--enable-gd-jis-conv \
--with-openssl \
--with-imap \
--with-imap-ssl \
--with-pdo-mysql=/usr \
--with-gettext=/usr \
--with-zlib=/usr \
--with-bz2=/usr \
--with-kerberos \
--with-mysqli=/usr/bin/mysql_config \
--enable-fpm

Mögliche Probleme

Fehler: configure: error: Unable to locate gmp.h

Lösung: Symbolischen link erstellen.

ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h

3. Kompilieren

Dass kann nun etwas dauern. Gab es keine Probleme beim Kompilieren installieren wir PHP 7 unter der Verwendung des Tools Checkinstall. Damit erhält man ein Debian/Ubuntu Paket dass man bei Bedarf auch wieder komplett deinstallieren kann.

make
checkinstall

Checkinstall fragt bei Erfolg nach eine Beschreibung und lässt uns Paketname und Maintainer eintragen. Als Paketname verwenden wir php7 damit wir nicht in Konflikt mit anderen PHP Versionen geraten.

Danach wird eine .deb Datei erstellt und diese auch gleich installiert. Deinstallieren kann man PHP 7 dann ganz normal über:

apt-get remove php7

Mögliche Probleme

Fehler: Hinweis man solle für pear.php.net –no-check-certificate verwenden.

Lösung: Kurzzeitig scheint die Domain pear.php.net auf eine falsche IP aufgelöst zu haben. Dies dürfte inzwischen behoben sein. Alternativ folgende parameter beim configure hinzufügen.

..
--with-mysqli=/usr/bin/mysql_config \
--enable-fpm \
--without-pear

Pear lässt sich auch später manuell installieren.

4. Erste Tests

Der einfachste Test ist es das Command Line Tool von PHP aufzurufen.

/opt/php7/bin/php -v

Gibt die Versionsnummer PHP 7.0.0beta1 aus. Mit dem nächsten Befehl erhalten wir Informationen zu den installierten Modulen und Konfigurationsparametern.

/opt/php7/bin/php -v

5. Verwendung als FPM Modul mit Apache und fastcgi

Wir gehen davon aus das Apache installiert ist und bereits funktioniert. Zur Sicherheit prüfen wir dennoch ob alle notwändigen Pakete vorhanden sind und aktivieren das Actions Modul:

apt-get install apache2-mpm-worker libapache2-mod-fastcgi
a2enmod actions

Als nächstes aktivieren wir die Konfiguration und starten php-fpm.

cd /opt/php7/etc
sudo cp php-fpm.conf.default php-fpm.conf
sudo cat php-fpm.d/www.conf.default | sed s/nobody/www-data/ > php-fpm.d/www.conf
sudo ../sbin/php-fpm

Damit haben wir in der www.conf die Benutzer und Gruppen nobody/nobody durch www-data/www-data ersetzt und php-fpm gestartet. Läuft schon ein php-fpm Server sollten die Werte für den Port ebenfalls angepasst werden. Statt www-data kann natürlich auch ein anderer Benutzer mit dessen Gruppe verwendet werden.

Nun fügen wir in den VirtualHost unserer Wahl folgende Zeile ein:

...
# This will override the default php5 handler from php5.conf
<FilesMatch ".+\.ph(p[345]?|t|tml)$">
 SetHandler php7-fcgi


# Add Action to route requests to php-fpm
Action php7-fcgi /php7-fcgi
# php7.fcgi doesn't have to exit but the folder does and needs to be within
# document root
Alias /php7-fcgi /var/www/php7.fcgi
FastCGIExternalServer /var/www/php7.fcgi -host 127.0.0.1:9000
...

Statt /var/www müssen wir den tatsächlichen Pfad zum DocumentRoot angeben. Wenn wir nun den Apache neu starten sollte der VirtualHost PHP7 verwenden.

Initscript für unseren neuen php-fpm Server

#! /bin/sh
### BEGIN INIT INFO
# Provides:          php-7.0.0beta1-1-fpm
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts php-7.0.0beta1-1-fpm
# Description:       starts the PHP FastCGI Process Manager daemon
### END INIT INFO
php_fpm_BIN=/opt/php7/sbin/php-fpm
php_fpm_CONF=/opt/php7/etc/php-fpm.conf
php_fpm_PID=/opt/php7/var/run/php-fpm.pid
php_opts="--fpm-config $php_fpm_CONF --pid $php_fpm_PID"
wait_for_pid () {
        try=0
        while test $try -lt 35 ; do
                case "$1" in
                        'created')
                        if [ -f "$2" ] ; then
                                try=''
                                break
                        fi
                        ;;
                        'removed')
                        if [ ! -f "$2" ] ; then
                                try=''
                                break
                        fi
                        ;;
                esac
                echo -n .
                try=`expr $try + 1`
                sleep 1
        done
}
case "$1" in
        start)
                echo -n "Starting php-fpm "
                $php_fpm_BIN $php_opts
                if [ "$?" != 0 ] ; then
                        echo " failed"
                        exit 1
                fi
                wait_for_pid created $php_fpm_PID
                if [ -n "$try" ] ; then
                        echo " failed"
                        exit 1
                else
                        echo " done"
                fi
        ;;
        stop)
                echo -n "Gracefully shutting down php-fpm "
                if [ ! -r $php_fpm_PID ] ; then
                        echo "warning, no pid file found - php-fpm is not running ?"
                        exit 1
                fi
                kill -QUIT `cat $php_fpm_PID`
                wait_for_pid removed $php_fpm_PID
                if [ -n "$try" ] ; then
                        echo " failed. Use force-exit"
                        exit 1
                else
                        echo " done"
                       echo " done"
                fi
        ;;
        force-quit)
                echo -n "Terminating php-fpm "
                if [ ! -r $php_fpm_PID ] ; then
                        echo "warning, no pid file found - php-fpm is not running ?"
                        exit 1
                fi
                kill -TERM `cat $php_fpm_PID`
                wait_for_pid removed $php_fpm_PID
                if [ -n "$try" ] ; then
                        echo " failed"
                        exit 1
                else
                        echo " done"
                fi
        ;;
        restart)
                $0 stop
                $0 start
        ;;
        reload)
                echo -n "Reload service php-fpm "
                if [ ! -r $php_fpm_PID ] ; then
                        echo "warning, no pid file found - php-fpm is not running ?"
                        exit 1
                fi
                kill -USR2 `cat $php_fpm_PID`
                echo " done"
        ;;
        *)
                echo "Usage: $0 {start|stop|force-quit|restart|reload}"
                exit 1
        ;;
esac

Eventuell müssen die Ordner /opt/php7/var /opt/php7/var/log und /opt/php7/var/run noch manuell erstellt werden.

6. Verwendung unter NginX

Bei einem NginX Virtualhost (server { } Direktive) sollten folgende Zeilen zu finden sein.

location ~ \.php$
   {
       include /etc/nginx/fastcgi_params;
       fastcgi_pass 127.0.0.1:9000;
       fastcgi_index index.php;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   }

Falls der Port in www.pool geändert wurde muß dieser hier ebenfalls geändert werden.

Von Christian Stengel

Geek, PHP Entwickler, Linux Admin

2 Antworten auf „Finales PHP 7 unter Ubuntu 14.04 LTS als php-fpm Variante testen.“

Kommentar verfassen

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.