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!
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
Na, sehr gerne!
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
Melde Dich gerne nochmal, ob es geklappt hat ;)
Das stimmt so nicht. PHP 7 ist für Owncloud 7 freigegeben worden, läuft aber nach wie vor mit PHP 5.6. Daran wird sich sicher so lange nichts ändern wie Debian jessie aktuell ist.
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.
Ja, es ist immer ein wenig Handarbeit nötig ;)
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?
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)
Super! Vielen dank für diese exzellente Anleitung.
Achso. Da fällt mir noch eine Frage ein. Hast du schon eine Quelle für die 7.1?
Leider gibt es (von Dotdeb) noch keine Quelle für PHP 7.1, aber das wird wohl kommen…
In dem Post zu Version 7.0.14 steht ja bereits: „I’ll detail the plan for PHP 7.1 in a future post.“
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!
Vielen Dank für das positive Feedback und schön, wenn ich helfen konnte ;)
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.
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 Modullibapache2-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)
Du hast ja auch wheezy (deb7) und nicht jessie (deb8) (oder einen katastrophalen Fehler in der Paketdatenbank).
@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 ;)
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.
Moin! Dotdeb wird nicht mehr lange weitergeführt oder ggf . schon eingestellt. Bitte schau einmal hier: https://ansas-meyer.de/programmierung/php/rip-dotdeb-hello-deb-sury-org/
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
Natürlich können auch erst die php5 Pakete deinstalliert werden ;)