PHP 7 unter Debian Jessie installieren

Am 3. Dezember 2015 ist mit PHP 7.0.0 nach über 10 Jahren ein neues Major Release erschienen. Am 17.12.2015 ist bereits das erste Update PHP 7.0.1 mit diversen Bugfixes released worden.

Da PHP 7 neben den diversen neuen Features – wie „Deklaration für skalare Typen und Rückgabewerte“ – bis zu zweimal so schnell wie PHP 5.6 sein soll lohnt sich ein Update, sofern die eigenen Skripte inkl. Drittsoftware (wie Frameworks oder Bibliotheken) mitspielen.

Inhalt


 

Prüfen ob die Software PHP 7 tauglich ist

Die genutzte Drittsoftware (Frameworks, Libraries, etc.) wird inzwischen wahrscheinlich auch bei Euch via Dependency Manager wie Composer bezogen oder direkt von GitHub geklont. Daher lohnt sich in diesen Fällen zunächst ein Blick auf die GitHub Seite der jeweiligen Entwickler. Bei den guten Bibliotheken sind Unit Tests sowieso vorhanden und wahrscheinlich werden diese über bspw. Travis CI oder CircleCI nach jedem Commit auch automatisiert durchlaufen. Und genau an diesen Stelle kann man dann schauen, ob auch PHP 7 bereits getestet wird und ob die Bibliotheken sauber und fehlerfrei durchlaufen.

Etwas schwieriger wird es dann bei der eigenen Software, die verständlicherweise nicht immer bei GitHub „geparkt“ wird. Hier hilft zunächst einmal ein Blick auf die Migrationsseiten von PHP: Migrating from PHP 5.6.x to PHP 7.0.x

Die Liste an „Backward incompatible changes“ ist zwar auf den ersten Blick echt lang, wer jedoch nichts all zu „abgefahrenes“ gemacht hat, wird wahrscheinlich keine Probleme bekommen… solange sauber programmiert wurde ;)


 

PHP 7 installieren

Zunächst muss sichergestellt sein, dass Ihr root Rechte habt und dass Debian 8 (Jessie) installiert ist. Da die Standard Paketquellen unter Jessie (derzeit) nur PHP 5.6 zulassen, muss noch die Paketquelle von DotDeb hinzugefügt werden. Dann können die Paketinformationen aktualisiert und PHP 7 installiert werden:

## become root
su

## check debian version (must be >= 8.0)
cat /etc/debian_version

## add dotdeb to apt sources list
echo 'deb http://packages.dotdeb.org jessie all' > /etc/apt/sources.list.d/dotdeb.list

## make sure apt accepts https transport
apt-get install apt-transport-https

## add dotdeb key for apt
curl http://www.dotdeb.org/dotdeb.gpg | apt-key add -

## get package list from sources incl. new set source dotdeb
apt-get update

## upgrade to php 7
apt-get install php7.0

 

Da jedoch PHP 5 auch noch installiert ist und Ihr wahrscheinlich auch noch Zusatzpakete wie ein MySQL Modul für PHP laufen habt, solltet Ihr zunächst installierten PHP Module ermitteln, die PHP 5 Module deinstallieren und die passenden PHP 7 Module zusätzlich installieren:

## get installed php packages
dpkg -l | grep php

## uninstall old php 5
apt-get purge php5*

## install needed php 7 modules
apt-get install php7.0-cli php7.0-curl php7.0-gd php7.0-geoip php7.0-intl php7.0-json php7.0-mbstring
apt-get install php7.0-mcrypt php7.0-mysql php7.0-opcache php7.0-readline php7.0-xml php7.0-xsl php7.0-zip

Die genannten Module sind natürlich in diesem Fall nur diejenigen, die ich bei mir installiert habe. Ihr müsst schauen was Euch der dpkg Befehl „ausspuckt“ und dann einfach schauen, was Ihr jeweils benötigt.

 

Im Normalfall sollte das PHP Plugin für den Apache 2.4 Webservers automatisch mit aktualisiert worden sein. Sollte dem nicht so sein, müsst Ihr das eben noch von Hand korrigieren:

## get installed php packages (should contain libapache2-mod-php7.0)
dpkg -l | grep php

## uninstall old php 5 apache module
apt-get purge libapache2-mod-php5

## install needed php 7 apache module
apt-get install libapache2-mod-php7.0

## restart webserver
service apache2 restart

Nun solltet Ihr damit PHP 5.6 durch PHP 7 ersetzt haben.


 

Update prüfen, läuft unter PHP 7 noch alles?

Zunächst solltet Ihr schauen, ob mit PHP generierte Seiten überhaupt angezeigt werden. Sollte dieses nicht der Fall sein, so schaut sowohl in den PHP Logs als auch den Apache Logs nach. Auch wenn alles zu laufen scheint, solltet Ihr jedoch einen Blick in die Error Logs riskieren.

Zusätzlich hier ein kleines Test-Skript, dass Ihr in jedem Projekthauptordner einmal ausführen solltet:

find . -name "*.php" -exec php -l {} \; 1>/dev/null

Dieses kleiner Helferlein sucht sich alle Dateien mit der Änderung .php und prüft diese Datei dann auf Syntaxfehler. Die normalen Ausgaben No syntax errors detected in ... werden verworfen und nur die Fehlermeldungen angezeigt. Sollte das Programm also ohne Ausgabe durchlaufen, gibt es keine offensichtlichen Fehler ;)


 

Fazit

PHP 7.0 ist deutlich schneller als PHP 5.6, zumindestens subjektiv. Zudem freue ich mich schon die neuen Features mal nach und nach einsetzen zu können. Insbesondere gefallen mit die „Deklaration für skalare Typen und Rückgabewerte“, die „Ersetzung der nervigen Fehlermeldungen durch eine Error Klasse analog zu Exceptions“ und der neue „Null coalescing operator“.

Ich hoffe der Beitrag konnte Euch helfen. Hinterlasst mir gerne Euer Feedback!

Das könnte dich auch interessieren …

22 Antworten

  1. Ralph Goldfuss sagt:

    An ( Nickname ) Ansas

    Vielen Vielen Dank !!!!!! für das Installations-Beispiel
    Es hat mir viel Zeit und Nerven gespart !!!
    Und deshalb nicht mit freundlichen Grüßen ….. soondern !!
    Hochachtungsvoll !!!!!
    Ralph Goldfuss

  2. stone sagt:

    Danke das du dies gepostet hast. Ich migriere gerade Owncloud 8.2 auf 9.0
    Dazu ist PHP7 erforderlich.

    Ich hoffe das klappt alles. Jedenfalls hast es sehr gute beschrieben.

    lg Stone

  3. Ralph sagt:

    Danke für die Anleitung.
    apt-get purge php5* listet aber bei meinem Jessie auch alle php7-Pakete mit auf, kann also nicht verwendet werden, wie oben beschrieben.

  4. Julian sagt:

    Vielen Dank für die tolle Anleitung.

    Das Update auf php7 hat funktioniert, nur leider geht bei mir ispconfig seid dem Upgrade nicht mehr.
    Ich erhalte jetzt ein 500 Error wenn ich das Adminpanal aufrufe.

    Vielleicht ne Idee wie ich das wieder hinbekomme?

    • Ansas Meyer sagt:

      Hi!

      Ich nutzte ISPConfig nicht, daher kann ich auch nur Anregungen geben:

      1. Aktuelle Version installieren (und prüfen, ob ISPConfig überhaupt PHP7 tauglich ist)
      2. In die Logs schauen (insb. vorhandene ISPConfig- und Werbserver-Logs)
      3. Ggf. weitere PHP Extensions nachinstallieren, denn einige Module sind aus dem PHP Core in Extensions verlagert worden (sudo apt-cache search php7.0 | sort)

  5. raiserle sagt:

    Super! Vielen dank für diese exzellente Anleitung.

  6. sideshow sagt:

    Auch von mir ein herzliches Dankeschön! Ich bin spät dran, einige Projekte auf PHP 7 „upzugraden“ und hatte arge Probleme, meine VMs (mit Vagrant) ordentlich und ohne viel Aufwand auf PHP 7 zu bringen. Mit Deiner Anleitung ging es aber recht schmerzfrei. Vielen Dank!

  7. Andy sagt:

    Ich habe die Anleitung befolgt, in dem ich php5 zuerst deinstalliert habe. Mache ich nun:

    apt-get install php7.0 libapache2-mod-php7.0 php7.0-fpm php7.0-cgi php7.0-common libpcre3 php7.0-cli php7.0-json php7.0-opcache libc6 php7.0-readline

    bekomme ich folgende unerfüllte Abhängigkeiten:

    libapache2-mod-php7.0 : Hängt ab von: apache2-api-20120211 ist aber nicht installierbar
    Hängt ab von: libc6 (>= 2.15) aber 2.13-38+deb7u11 soll installiert werden
    libpcre3 : Hängt ab von: libc6 (>= 2.14) aber 2.13-38+deb7u11 soll installiert werden
    php7.0-cgi : Hängt ab von: libc6 (>= 2.15) aber 2.13-38+deb7u11 soll installiert werden
    php7.0-cli : Hängt ab von: libc6 (>= 2.15) aber 2.13-38+deb7u11 soll installiert werden
    php7.0-common : Hängt ab von: libc6 (>= 2.15) aber 2.13-38+deb7u11 soll installiert werden
    php7.0-fpm : Hängt ab von: init-system-helpers (>= 1.18~) ist aber nicht installierbar
    Hängt ab von: libc6 (>= 2.15) aber 2.13-38+deb7u11 soll installiert werden
    Hängt ab von: libsystemd0 ist aber nicht installierbar
    php7.0-json : Hängt ab von: libc6 (>= 2.14) aber 2.13-38+deb7u11 soll installiert werden
    php7.0-opcache : Hängt ab von: libc6 (>= 2.14) aber 2.13-38+deb7u11 soll installiert werden
    php7.0-readline : Hängt ab von: libc6 (>= 2.14) aber 2.13-38+deb7u11 soll installiert werden
    Hängt ab von: libedit2 (>= 3.1-20130611) aber 2.11-20080614-5 soll installiert werden
    E: Probleme können nicht korrigiert werden, Sie haben zurückgehaltene defekte Pakete.

    • Ansas Meyer sagt:

      Schau zunächst einmal mit dpkg -l | grep php5 ob nicht ggf. doch noch irgendwelche php5 Module übrig geblieben sind… dazu gehört bspw. auch das Modul libapache2-mod-php5.

      Wenn alle alten php Module vollständig entfernt wurden, schau auch nochmal, ob Du nicht ggf. Apache 2.4 installieren musst (und noch Apache 2.2 installiert hast).

      Generell wäre es auch vielleicht ratsam gleich von `dotdeb` zu `sury` zu wechseln (siehe aktuellen Beitrag)

    • MOW sagt:

      Du hast ja auch wheezy (deb7) und nicht jessie (deb8) (oder einen katastrophalen Fehler in der Paketdatenbank).

      • Ansas Meyer sagt:

        @Andy: Steht ja auch so ziemlich als erster Punkt in der Anleitung: ## check debian version (must be >= 8.0)

        @MOW: Danke für den Hinweis, hab ich doch tatsächlich ganz überlesen ;)

  8. John sagt:

    Ich kriege folgende Meldung bei der Installation :
    apt-get install php7.0-cli php7.0-curl php7.0-gd php7.0-geoip php7.0-intl php7.0-json php7.0-mbstring
    Paketlisten werden gelesen… Fertig
    Abhängigkeitsbaum wird aufgebaut.
    Statusinformationen werden eingelesen…. Fertig
    E: Paket php7.0-cli kann nicht gefunden werden.
    E: Mittels regulärem Ausdruck »php7.0-cli« konnte kein Paket gefunden werden.
    E: Paket php7.0-curl kann nicht gefunden werden.
    E: Mittels regulärem Ausdruck »php7.0-curl« konnte kein Paket gefunden werden.
    E: Paket php7.0-gd kann nicht gefunden werden.
    E: Mittels regulärem Ausdruck »php7.0-gd« konnte kein Paket gefunden werden.
    E: Paket php7.0-geoip kann nicht gefunden werden.
    E: Mittels regulärem Ausdruck »php7.0-geoip« konnte kein Paket gefunden werden.
    E: Paket php7.0-intl kann nicht gefunden werden.
    E: Mittels regulärem Ausdruck »php7.0-intl« konnte kein Paket gefunden werden.
    E: Paket php7.0-json kann nicht gefunden werden.
    E: Mittels regulärem Ausdruck »php7.0-json« konnte kein Paket gefunden werden.
    E: Paket php7.0-mbstring kann nicht gefunden werden.
    E: Mittels regulärem Ausdruck »php7.0-mbstring« konnte kein Paket gefunden werden.

    source list sieht so aus:

    deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi
    # Uncomment line below then ‚apt-get update‘ to enable ‚apt-get source‘
    deb-src http://archive.raspbian.org/raspbian/ jessie main contrib non-free rpi
    deb http://packages.dotdeb.org jessie all
    deb-src http://packages.dotdeb.org jessie all

    Wieso kann ich die Pakete nicht installieren ? Ich nutze einen Banana Pi mit 2016-07-12-raspbian-lite-bpi-m1.

  9. Davide sagt:

    Hallo Ansas Meyer,
    Ich fand Ihre Tutorials zu den besten und einfachsten und geschrieben in einer verständlichen Art und Weise!

    Ich schreibe Ihnen aus zwei Gründen:

    1) der „foo“ Befehl automatisch aktualisiert auf Version 7?
    Du schreibst „## upgrade auf PHP 7“
    2) Wenn nicht, ist es nicht korrekt, die Pakete „php5“ zuerst zu entfernen und dann die Pakete „php7“ zu installieren?

    Vielen Dank für Ihren Guide!

    PS
    .. ich hoffe ich habe es gut geschrieben, weil ich nicht viel von Deutsch verstehe! :-)

    Davide

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Bitte beachte die Hinweise zum Datenschutz