Nachdem PHP 6 übersprungen wurde, ist PHP 7 die neue zukünftige Produktionsversion für PHP, die auch Oktober 2015 in einer finalen Version bereitstehen soll. Da inzwischen die erste Beta Version verfügbar ist, wird es Zeit diese einmal auszuprobieren. Offizielle Pakete für Ubuntu oder Debian gibt es noch nicht, daher installieren wir PHP7 aus dem Sourcecode und zwar als php-fpm Variante um bestehende PHP Installationen auf dem Server nicht zu stören.
Update PHP 7.0.0: Finales PHP 7 unter Ubuntu 14.04 LTS als php-fpm Variante testen
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
Den aktuellsten Sourcecode erhält man aus dem offiziellen Git Repository. Wir verwenden jedoch erstmal den aktuellen Beta Release vom PHP FTP-Server.
cd /usr/local/src wget wget https://downloads.php.net/~ab/php-7.0.0beta1.tar.bz2 tar -jxf php-7.0.0beta1.tar.bz2 cd php-7.0.0beta1
Damit haben wir den Sourcecode heruntergeladen entpackt und sind in das neue Verzeichnis gewechselt.
2. Konfigurieren des Sourcecodes
Um die wichtigsten Bibliotheken zu installieren können wir folgende Kommandos verwenden.
sudo aptitude build-dep php5 sudo apt-get install libc-client2007e-dev libmcrypt-dev openssl courier-imap libgmp-dev checkinstall
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 beim Konfigurieren
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
Hierfür sollte man etwas Zeit einplanen. 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
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.