{"id":7777,"date":"2021-10-16T20:05:26","date_gmt":"2021-10-16T18:05:26","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=7777"},"modified":"2022-12-12T18:27:33","modified_gmt":"2022-12-12T16:27:33","slug":"aktuelles-php-8-auf-dem-raspberry-pi-installieren-so-nutzt-ihr-inoffizielle-paketquellen","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/aktuelles-php-8-auf-dem-raspberry-pi-installieren-so-nutzt-ihr-inoffizielle-paketquellen\/","title":{"rendered":"Aktuelles PHP 8 auf dem Raspberry Pi installieren: So nutzt ihr inoffizielle Paketquellen"},"content":{"rendered":"<p><a href=\"https:\/\/u-labs.de\/portal\/neue-software-auf-dem-raspberry-pi-installieren-so-erweiterst-du-die-funktionalitaet-deines-pis\/\" title=\"Neue Software auf dem Raspberry Pi installieren: So erweiterst du die Funktionalit\u00e4t deines Pis!\">Mit der Paketverwaltung haben wir bereits als zentrale Anlaufstelle zum installieren neuer Programme<\/a> vorgestellt. Es enth\u00e4lt viele n\u00fctzliche Programme, aber nicht alle. Es gibt verschiedene M\u00f6glichkeiten, um Programme zu installieren, die es dort noch nicht gibt. Einer davon ist das Hinzuf\u00fcgen von Drittanbieter-Paketquellen, diesen Weg m\u00f6chte ich dir im folgenden erkl\u00e4ren.<\/p>\n<h2 class=\"wp-block-heading\">Warum Drittabieter-Paketquellen nutzen?<\/h2>\n<p>Es gibt haupts\u00e4chlich zwei Gr\u00fcnde:<\/p>\n<ol class=\"wp-block-list\">\n<li>Ihr m\u00f6chtet ein Programm installieren, das in den offiziellen Paketquellen nicht enthalten ist. Der Entwickler oder Hersteller bietet aber eine eigene Paketquelle an, die er selbst pflegt.<\/li>\n<li>Das gew\u00fcnschte Programm gibt es zwar in den offiziellen Paketquellen, aber in einer deutlich \u00e4lteren Version &#8211; du ben\u00f6tigst jedoch eine aktuellere.<\/li>\n<\/ol>\n<p>Gerade letzteres kann ein Problem sein: Debian testet gr\u00fcndlich und ist eher konservativ. Da das Raspberry Pi OS auf Debian aufbaut, dauert es hier noch etwas l\u00e4nger.<\/p>\n<p>Schauen wir uns das am Beispiel von PHP an. PHP ist ein g\u00e4ngiges Beispiel, da neuere Versionen hier oft Verbesserungen oder sogar neue Funktionen mitliefern. Zum Erstellungszeitpunkt erhalten wir \u00fcber die Raspberry Pi OS Paketquellen PHP 7.3.29 vom Juli 2021. Im 7.3 Zweig w\u00e4re die aktuellste Version 7.3.31. Es gibt aber zwei neuere Zweige: 7.4.24 und eine Hauptversion h\u00f6her 8-0.11.<\/p>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-24.png\"><img loading=\"lazy\" decoding=\"async\" width=\"977\" height=\"562\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-24.png\" alt=\"\" class=\"wp-image-7779\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-24.png 977w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-24-300x173.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-24-768x442.png 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-24-70x40.png 70w\" sizes=\"auto, (max-width: 977px) 100vw, 977px\" \/><\/a><figcaption class=\"wp-element-caption\">\u00dcbersicht der unterst\u00fctzten PHP-Versionen &#8211; Quelle: <a href=\"https:\/\/www.php.net\/supported-versions.php\" target=\"_blank\" rel=\"nofollow\">php.net<\/a><\/figcaption><\/figure>\n<h2 class=\"wp-block-heading\">Was sind Drittanbieter-Paketquellen?<\/h2>\n<p>Im zuvor erw\u00e4hnten Video habe ich die Funktionsweise des Paketsystems <strong>apt <\/strong>erkl\u00e4rt. Dies stammt von Debian und wird auch auf dem Raspberry Pi OS eingesetzt. Die dort gezeigten Paketquellen werden von der Raspberry Pi Organisation gepr\u00fcft. Sie stellen dabei sicher, dass die Pakete funktionieren und es m\u00f6glichst zu keinen Konflikten mit anderen Paketen kommt. Au\u00dferdem werden die Programme auf \u00dcberwachungs- und Schadsoftware gepr\u00fcft, um deren Sicherheit zu gew\u00e4hren.<\/p>\n<p>Jeder kann eine eigene Paketquelle erstellen, beispielsweise der Hersteller einer Software. Hier finden diese beiden Pr\u00fcfungen allerdings nicht statt: Der Eigent\u00fcmer der Paketquelle ist komplett Eigenst\u00e4ndig daf\u00fcr verantwortlich, dass seine Software keine Probleme verursacht und frei von Schadsoftware ist. F\u00fcr uns als Nutzer bedeutet das: Wenn wir eine inoffizielle Paketquelle hinzuf\u00fcgen, m\u00fcssen wir dem Autor vertrauen. Und darauf achten, dass er Aktualisierungen m\u00f6glichst zeitnah einspielt.<\/p>\n<p>Man sollte daher sparsam und sorgsam mit inoffiziellen Paketquellen umgehen. Eine gute Anlaufstelle sind Hersteller, die bereits seit l\u00e4ngerem eine solche Paketquelle zuverl\u00e4ssig pflegen.<\/p>\n<h2 class=\"wp-block-heading\">Wie f\u00fcge ich eine inoffizielle Paketquelle zu meinem Raspberry Pi hinzu?<\/h2>\n<p>F\u00fcr PHP demonstriere ich dies am <a href=\"https:\/\/deb.sury.org\/\" title=\"https:\/\/deb.sury.org\/\" target=\"_blank\" rel=\"nofollow\">deb.sury.org Repository<\/a>. Es stammt von einem Debian-Entwickler mit 20 Jahren Erfahrung, der seit Jahren die aktuellsten stabilen PHP-Versionen dort bereitstellt. Ein offizielles Debian-Projekt ist es jedoch nicht, er betreibt es privat. <\/p>\n<p>Zun\u00e4chst m\u00fcssen wir den Schl\u00fcssel des Repositories hinzuf\u00fcgen. Er dient zur Sicherheit, um Manipulationen auf dem Transportweg durchs Internet auszuschlie\u00dfen. Man findet den Link dazu meist auf der Projektseite oder in der Dokumentation.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">wget -O \/tmp\/php.gpg https:\/\/packages.sury.org\/php\/apt.gpg\nsudo mv \/tmp\/php.gpg \/etc\/apt\/trusted.gpg.d\/<\/code><\/pre>\n<p>Es gibt verschiedene Wege, um die Paketquelle selbst hinzuzuf\u00fcgen. In jedem Falle wird dabei ein Eintrag bzw. eine Liste in <strong>\/etc\/apt<\/strong> angelegt. Die Hauptdatei ist <strong>\/etc\/apt\/sources.list<\/strong>, sie enth\u00e4lt die offiziellen Paketquellen vom Raspberry Pi OS. Man kann dort eigene hinzuf\u00fcgen. \u00dcbersichtlicher ist es jedoch, wenn man eine eigene Datei in <strong>\/etc\/apt\/sources.list.d <\/strong>anlegt. Sie muss die Endung <strong>.list<\/strong> besitzen, damit sie geladen wird. Mit <em>echo <\/em>und <strong>tee <\/strong>schreiben wir einen Eintrag in die Datei <strong>\/etc\/apt\/sources.list.d\/php.list<\/strong> und aktualisieren anschlie\u00dfend die Paketquellen sowie Pakete:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">echo &quot;deb https:\/\/packages.sury.org\/php\/ $(lsb_release -sc) main&quot; | sudo tee \/etc\/apt\/sources.list.d\/php.list\nsudo apt update\nsudo apt upgrade<\/code><\/pre>\n<p>Welche PHP-Versionen durch das neue Repo verf\u00fcgbar sind, sehen wir beispielsweise durch die Eingabe von <strong>php<\/strong> gefolgt von der Tab-Taste:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ php &lt;Tab&gt;\nphp        php7.3     php8.0     phpdismod  phpenmod   phpquery<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Variante 1: Ihr habt bereits Apache mit PHP installiert und m\u00f6chtet auf die neueste Version upgraden<\/h2>\n<p>Hier seid ihr richtig, wenn ihr zuvor bereits die PHP-Version aus dem <a href=\"https:\/\/u-labs.de\/portal\/dynmaische-webseiten-apache2-webserver-mit-php-und-mysql-mariadb-auf-dem-raspberry-pi-installieren-einfachster-weg-fuer-anfaenger-lamp\/\" title=\"Dynmaische Webseiten: Apache2 Webserver mit PHP und MySQL\/MariaDB auf dem Raspberry Pi installieren \u2013 einfachster Weg f\u00fcr Anf\u00e4nger (LAMP)\">Standard-Repo installiert habt, wie im vorherigen Beitrag gezeigt<\/a>. Im Apache2 Webserver m\u00fcssen wir nun das alte PHP 7 Modul deaktivieren und das neue von Version 8 aktivieren. Wie das aktiviert hei\u00dft, l\u00e4sst sich auf zwei Wegen herausfinden: sudo a2dismod php und die &lt;Tab&gt; Taste dr\u00fccken. Dann wird der Name automatisch vervollst\u00e4ndigt, etwa <strong>php7.3<\/strong> in diesem Beispiel. Alternativ sieht man dies auch im <strong>Verzeichnis \/etc\/apache2\/mods-enabled\/<\/strong>, wenn man mit <strong>grep <\/strong>nach <strong>php <\/strong>sucht:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ sudo a2dismod php7.3\n\n# Alternativ\n$ ls -l \/etc\/apache2\/mods-enabled\/ | grep php\nlrwxrwxrwx 1 root root 29 Okt 10 16:25 php7.3.conf -&gt; ..\/mods-available\/php7.3.conf\nlrwxrwxrwx 1 root root 29 Okt 10 16:25 php7.3.load -&gt; ..\/mods-available\/php7.3.load<\/code><\/pre>\n<p>Die neue PHP-Version ermitteln wir auf die gleiche Art- und Weise. Allerdings mit <strong>a2enmod<\/strong>:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ sudo a2enmod php8.0\n\n# Alternativ\n$ ls -l \/etc\/apache2\/mods-available | grep php\n-rw-r--r-- 1 root root  855 Jul  2 06:04 php7.3.conf\n-rw-r--r-- 1 root root  102 Jul  2 06:04 php7.3.load\n-rw-r--r-- 1 root root  855 Sep 24 00:03 php8.0.conf\n-rw-r--r-- 1 root root  101 Sep 24 00:03 php8.0.load\n\n$ sudo systemctl restart apache<\/code><\/pre>\n<p>Es macht Sinn, abschlie\u00dfend noch die alten Pakete zu bereinigen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo apt autoremove<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Variante 2: PHP ist noch nicht installiert<\/h2>\n<p>Das ist der einfachste Fall: Ihr k\u00f6nnt direkt die neueste Version installieren, zum Erstellzeitpunkt war das die Version 8.0. Falls noch nicht geschehen, vorher Apache oder den gew\u00fcnschten Webserver installieren:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ sudo apt install apache2\n$ sudo apt install php8.0 php8.0-mysql php8.0-mbstring<\/code><\/pre>\n<p>Die Pakete <strong>php8.0-mysql<\/strong> und <strong>php8.0-mbstring<\/strong> sind optional, werden in den meisten F\u00e4llen aber ben\u00f6tigt.<\/p>\n<h2 class=\"wp-block-heading\">Finaler Test: Funktioniert PHP 8?<\/h2>\n<p>So erhalten wir nach dem Neustart des Apache2 Dienstes die derzeit aktuellste stabile PHP 8 Version:<\/p>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-23.png\"><img loading=\"lazy\" decoding=\"async\" width=\"950\" height=\"291\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-23.png\" alt=\"\" class=\"wp-image-7778\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-23.png 950w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-23-300x92.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-23-768x235.png 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/10\/grafik-23-70x21.png 70w\" sizes=\"auto, (max-width: 950px) 100vw, 950px\" \/><\/a><\/figure>\n<h2 class=\"wp-block-heading\">Installation von PHP-Erweiterungen<\/h2>\n<p>Auch einige Erweiterungen werden f\u00fcr die neue PHP-Version angeboten. Eine Liste erh\u00e4lt man beispielsweise durch die Autovervollst\u00e4ndigung:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ sudo apt install php8.0-\nDisplay all 147 possibilities? (y or n) y\nphp8.0-amqp                   php8.0-curl-dbgsym            php8.0-gmagick-dbgsym         php8.0-interbase              php8.0-memcached              php8.0-pgsql                  php8.0-rrd-dbgsym             php8.0-tidy                   php8.0-xsl\nphp8.0-amqp-dbgsym            php8.0-dba                    php8.0-gmp                    php8.0-interbase-dbgsym       php8.0-memcache-dbgsym        php8.0-pgsql-dbgsym           php8.0-smbclient              php8.0-tidy-dbgsym            php8.0-yac\nphp8.0-apcu                   php8.0-dba-dbgsym             php8.0-gmp-dbgsym             php8.0-intl                   php8.0-memcached-dbgsym       php8.0-phpdbg                 php8.0-smbclient-dbgsym       php8.0-uopz                   php8.0-yac-dbgsym\nphp8.0-apcu-dbgsym            php8.0-decimal                php8.0-gnupg                  php8.0-intl-dbgsym            php8.0-mongodb                php8.0-phpdbg-dbgsym          php8.0-snmp                   php8.0-uopz-dbgsym            php8.0-yaml\nphp8.0-ast                    php8.0-decimal-dbgsym         php8.0-gnupg-dbgsym           php8.0-ldap                   php8.0-mongodb-dbgsym         php8.0-protobuf               php8.0-snmp-dbgsym            php8.0-uploadprogress         php8.0-yaml-dbgsym\nphp8.0-ast-dbgsym             php8.0-dev                    php8.0-grpc                   php8.0-ldap-dbgsym            php8.0-msgpack                php8.0-protobuf-dbgsym        php8.0-soap                   php8.0-uploadprogress-dbgsym  php8.0-zip\nphp8.0-bcmath                 php8.0-ds                     php8.0-grpc-dbgsym            php8.0-lz4                    php8.0-msgpack-dbgsym         php8.0-pspell                 php8.0-soap-dbgsym            php8.0-uuid                   php8.0-zip-dbgsym\nphp8.0-bcmath-dbgsym          php8.0-ds-dbgsym              php8.0-http                   php8.0-lz4-dbgsym             php8.0-mysql                  php8.0-pspell-dbgsym          php8.0-solr                   php8.0-uuid-dbgsym            php8.0-zmq\nphp8.0-bz2                    php8.0-enchant                php8.0-http-dbgsym            php8.0-mailparse              php8.0-mysql-dbgsym           php8.0-psr                    php8.0-solr-dbgsym            php8.0-vips                   php8.0-zmq-dbgsym\nphp8.0-bz2-dbgsym             php8.0-enchant-dbgsym         php8.0-igbinary               php8.0-mailparse-dbgsym       php8.0-oauth                  php8.0-psr-dbgsym             php8.0-sqlite3                php8.0-vips-dbgsym            php8.0-zstd\nphp8.0-cgi                    php8.0-fpm                    php8.0-igbinary-dbgsym        php8.0-maxminddb              php8.0-oauth-dbgsym           php8.0-raphf                  php8.0-sqlite3-dbgsym         php8.0-xdebug                 php8.0-zstd-dbgsym\nphp8.0-cgi-dbgsym             php8.0-fpm-dbgsym             php8.0-imagick                php8.0-maxminddb-dbgsym       php8.0-odbc                   php8.0-raphf-dbgsym           php8.0-ssh2                   php8.0-xhprof\nphp8.0-cli                    php8.0-gd                     php8.0-imagick-dbgsym         php8.0-mbstring               php8.0-odbc-dbgsym            php8.0-readline               php8.0-ssh2-dbgsym            php8.0-xhprof-dbgsym\nphp8.0-cli-dbgsym             php8.0-gd-dbgsym              php8.0-imap                   php8.0-mbstring-dbgsym        php8.0-opcache                php8.0-readline-dbgsym        php8.0-swoole                 php8.0-xml\nphp8.0-common                 php8.0-gearman                php8.0-imap-dbgsym            php8.0-mcrypt                 php8.0-opcache-dbgsym         php8.0-redis                  php8.0-swoole-dbgsym          php8.0-xml-dbgsym\nphp8.0-common-dbgsym          php8.0-gearman-dbgsym         php8.0-inotify                php8.0-mcrypt-dbgsym          php8.0-pcov                   php8.0-redis-dbgsym           php8.0-sybase                 php8.0-xmlrpc\nphp8.0-curl                   php8.0-gmagick                php8.0-inotify-dbgsym         php8.0-memcache               php8.0-pcov-dbgsym            php8.0-rrd                    php8.0-sybase-dbgsym          php8.0-xmlrpc-dbgsym\n<\/code><\/pre>\n<p>M\u00f6chten wir beispielsweise Bilder bearbeiten, kann man verschiedene Erweiterungen wie Imagick oder GD installieren. Curl ist ebenfalls eine beliebte Erweiterung, um HTTP-Anfragen durchzuf\u00fchren. Damit diese geladen werden und in PHP verf\u00fcgbar sind, anschlie\u00dfend den Apache2 Webserver neu starten:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ sudo apt install php8.0-imagick\n$ sudo systemctl restart apache<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Aufbau eines Eintrages in der Paketliste<\/h2>\n<p>Werfen wir einen kurzen Blick auf den Eintrag, den wir soeben angelegt haben:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ cat \/etc\/apt\/sources.list.d\/php.list\ndeb https:\/\/packages.sury.org\/php\/ buster main<\/code><\/pre>\n<p><strong>deb<\/strong> gibt das Format an. Unter Debian und dem Raspberry Pi OS ist deb das Standardformat f\u00fcr Pakete. Alternativ gibt es auch noch <strong>deb-src<\/strong>, womit man den Quellcode herunterladen kann &#8211; beispielsweise um ihn zu pr\u00fcfen oder \u00c4nderungen vorzunehmen.<\/p>\n<p>Nach der URL folgt die Distribution. Bei mir ist das Debian 10 Buster, wie man \u00fcber <strong>lsb_release -c<\/strong> ermitteln kann. Welche Versionen unterst\u00fctzt werden, variiert je nach Paketquelle. Hier sind es beispielsweise die LTS-Versionen von Debian.<\/p>\n<p>Die Kategorie <strong>main<\/strong> steht f\u00fcr freie Software aus offiziellen Quellen. Es gibt noch <strong>contrib<\/strong> f\u00fcr freie Software, die Abh\u00e4ngigkeiten zu nicht freier Software besitzt. Ist das Programm selbst nicht frei, steht es in der Gruppe <strong>non-free<\/strong>. Entsprechend der Debian-Philosophie sinkt damit die Vertrauensstufe, da propriet\u00e4re Software aufgrund der fehlenden Transparenz in der Regel nicht \u00fcberpr\u00fcft werden kann. In unserem PHP-Beispiel ist das wenig relevant, da PHP komplett frei ist.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit der Paketverwaltung haben wir bereits als zentrale Anlaufstelle zum installieren neuer Programme vorgestellt. Es enth\u00e4lt viele n\u00fctzliche Programme, aber nicht alle. Es gibt verschiedene M\u00f6glichkeiten, um Programme zu installieren, die es dort noch nicht gibt. Einer davon ist das Hinzuf\u00fcgen von Drittanbieter-Paketquellen, diesen Weg m\u00f6chte ich dir im folgenden erkl\u00e4ren. Warum Drittabieter-Paketquellen nutzen? Es &#8230;<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[671],"tags":[55,979,980,981],"class_list":["post-7777","post","type-post","status-publish","format-standard","hentry","category-raspberry-pi","tag-php","tag-php8","tag-programmieren","tag-webentwicklung"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7777","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=7777"}],"version-history":[{"count":10,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7777\/revisions"}],"predecessor-version":[{"id":9821,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7777\/revisions\/9821"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=7777"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=7777"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=7777"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}