PHP 7.0 neben 7.2

Hallo,

ich müsste neben existierendem PHP 7.2 noch auf Ubuntu Server 18.04 noch 7.0 installieren, damit unser altes Belwü-Moodle auf dem lokalen Webserver in der Schule läuft.

Mit 2 PHP-Versionen parallel habe ich aber keine Erfahrungen. Hat jemand einen heißen Tipp?

Viele Grüße
Steffen

Hallo Steffen,

ich müsste neben existierendem PHP 7.2 noch auf Ubuntu Server 18.04 noch
7.0 installieren, damit unser altes Belwü-Moodle auf dem lokalen
Webserver in der Schule läuft.

Mit 2 PHP-Versionen parallel habe ich aber keine Erfahrungen. Hat jemand
einen heißen Tipp?

es ist problemlos mehrere php Version en auf einem Server zu
installieren: aber nur eine ist die Default php Version.
Vielleiht kann man mit einer inividuellen php.ini im webroot vorgeben,
welche für diese Webseite gilt … aber ich glaube, du brauchst das
nicht: dein gewünschte smoodle 3.1 läuft auch mit php 7.2

LG
Holger

Hallo Holger,

diese Seite behauptet was anderes:

PHP 7.2 can be used with Moodle 3.4 and later releases

Auch bekomme ich nur eine leere weiße Seite, wenn ich versuche, das Moodle 3.1 auf meinem Webserver aufzurufen.

Viele Grüße
Steffen

Hallo Holger,

das Apache-Log hat mir nach Googeln der Fehlermeldung nun bestätigt, dass Moodle 3.1 nicht mit PHP 7.2 läuft:

If you look here:

Moodle 3.3 release notes - MoodleDocs

You will see that PHP 7.0.x and 7.1.x can be used with caution. Nobody mentions PHP 7.2.x which is what you have.

In PHP 7.2 it is strictly prohibited to declare classes that have reserved names. Moodle up until 3.4 does have instances of this.

Possible solutions:

Downgrade the PHP to 7.1x or older. if you do choose PHP 7.1x make sure it is 7.1.13 or more recent because of another issue: https://help.nextcloud.com/t/php-error-narrowing-occurred-during-type-inference/24010/15
Another option is to use Moodle 3.4 which does support PHP 7.2

Wie Frank schon schrieb: Alles nicht so einfach - v.a. nicht mal eben „auf die Schnelle“.

Viele Grüße
Steffen

Hallo Steffen,

es ist relativ unproblematisch mehrere PHP-Versionen nebeneinander zu betreiben.

Ich glaube für PHP 7.0 ist nicht einmal ein neues Repo notwendig, da diese auch bei Ubuntu verfügbar sein müsste?!

Wichtig ist, dass durch das Installieren von weiteren Versionen die Default-Version geändert wird. Bei Ubuntu 18.04 ist dies die PHP 7.2. Heißt nach dem Installieren zurücksetzen auf PHP 7.2 nicht vergessen, um Probleme zu vermeiden.

Das geht mit:
sudo update-alternatives --config php
sudo update-alternatives --config php-cgi

Ich erstelle dann für die einzelnen Seiten einen FPM-Socket und nutze diesen dann über den virtuellen Host für die jeweilige Seite.

Ich poste hier mal eine Beispiel-Konfiguration, die für dein System angepasst werden muss:

Über:
sudo nano /etc/php/7.0/fpm/pool.d/moodle.conf

folgenden Code erstellen:

[moodle]

listen = /var/lib/php7.0-fpm/moodle.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

user = www-data
group = www-data

pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 5
pm.max_requests = 0

chdir = /

env[HOSTNAME] = $HOSTNAME
env[TMP] = /var/www/moodle-seite.de/tmp
env[TMPDIR] = /var/www/moodle-seite.de/tmp
env[TEMP] = /var/www/moodle-seite.de/tmp
env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

php_admin_value[open_basedir] = /var/www/moodle-seite.de/web:/var/www/moodle-seite.de/private:/var/www/moodle-seite.de/tmp
php_admin_value[session.save_path] = /var/www/moodle-seite.de/tmp
php_admin_value[upload_tmp_dir] = /var/www/moodle-seite.de/tmp
php_admin_value[sendmail_path] = „/usr/sbin/sendmail -t -i -f MAILADRESSE“

php_admin_flag[cgi.fix_pathinfo] = 1

Dann FPM neustarten und wenn der Service läuft wurde aus der conf ein individueller Socket unter /var/lib/php7.0-fpm/moodle.sock angelegt.

sudo service php7.0-fpm restart
sudo systemctl status php7.0-fpm.service

Vorteil an dieser Vorgehensweise ist, dass man die php.ini nicht verbiegen muss, da man sämtliche Infos für die jeweilige Seite/Anforderung über den individuellen Socket und die Befehle „php_admin_value[…] =“ und „php_admin_flag[…] =“ angeben kann. Das ist vor allem sinnvoll, wenn mehrere Anwendungen mit verschiedenen PHP-Anforderungen das jeweilige PHP nutzen sollen.

Dann muss der PHP-Inhalt nur noch über diesen Socket im virtuellen Host der Moodle-Seite aufgerufen werden. Leider kann ich hier nicht mit einem Beispiel helfen, da ich nginx nutze.
Bei nginx ist es einfach. Dort wird der PHP-Inhalt der jeweiligen Seite im virtuellen Host einfach über fastcgi_pass unix:/var/lib/php7.0-fpm/moodle.sock; aufgerufen.

Viele Grüße aus Leipzig

Steffen

hallo Steffen,

leider nein.

apt install php7.0
Paketlisten werden gelesen… Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen… Fertig
Hinweis: »php7.0-remctl« wird für regulären Ausdruck »php7.0« gewählt.
Hinweis: »php7.0-common« wird für regulären Ausdruck »php7.0« gewählt.
Hinweis: »php-remctl« wird an Stelle von »php7.0-remctl« gewählt.
php-remctl ist schon die neueste Version (3.13-1+deb9u1).
0 aktualisiert, 0 neu installiert, 0 zu entfernen und 4 nicht aktualisiert.

ich nehme an, das muss man dann für alle PHP Versionen machen?

Viele Grüße
Steffen

Hallo,

noch was: Für wie wahrscheinlich haltet ihr, dass einem ein zusätzliches PHP aus einer Fremdquelle beim Update von Ubuntu 18.04 auf die Füße fällt?

Viele Grüße
Steffen

Hallo Steffen,

wenn PHP7.0 nicht in den Ubuntu-Repos vorhanden ist, dann kann ich die Repo von Ondrej Sury empfehlen. Die ist immer aktuell und bringt neben PHP7.0 auch PHP5.6, PHP7.1, PHP7.3 und PHP7.4 für Ubuntu 18.04 mit sich.

sudo add-apt-repository ppa:ondrej/php

Achtung! Über ein apt update und apt upgrade wird dann auch die 7.2 angepasst und vermutlich eine aktuelle Version der 7.2 erhalten. Falls du das nicht willst, die Repo nur für die Installation der PHP7.0 und allen notwendigen Erweiterungen nutzen und vor einem apt upgrade die Repo wieder entfernen.

Den FPM-Socket kannst du ganz individuell für die jeweilige Seite und die dafür benötigte PHP-Version anlegen. Er muss nicht für jede PHP-Version angelegt werden.
Wenn du allerdings verschiedene PHP-Versionen ausprobieren willst, schadet es nicht, für die jeweilige PHP-Version mit einer conf-Datei einen FPM-Socket anzulegen und diesen dann in den virtuellen Hosts zu testen.

Viele Grüße
Steffen

Hallo Steffen

Für mich schwer zu sagen, da ich für meine Webserver von vornherein ausschließlich die Fremdrepo von Sury nehme. Ich kann nicht genau sagen, was passiert, wenn man vorher nur auf der Originalquelle unterwegs war.

Viele Grüße

Steffen

Hallo Steffen.

Da wäre es eventuell besser, das 7.2 auch über das Fremdrepo überbügeln zu lassen?!?

Andererseits ist es wahrscheinlich aber eh so, dass Ubuntu 20.04 kein PHP 7.2 mehr mitbringen wird, sondern höher. Also wird dann das 7.2 aus den Ubuntuquellen gegen > 7.2 ersetzt.

Außerdem kann ich ja das 7.0 vorher wieder deinstallieren. Dann sollte es hoffentlich keine Probleme beim Umstieg auf 20.04 geben…

Viele Grüße
Steffen

Hallo Steffen

ich habe jetzt 7.0 aus dem Repo installiert, allerdings gibt’s kein Verzeichnis /etc/php/7.0/fpm/pool.d

Ich vermute, da fehlt noch was.

Viele Grüße
Steffen

Hallo,

klar, muss natürlich auch php7.0-fpm installieren, bevor ich das Repo wieder auskommentiere.

Allerdings gibt’s auch kein Verzeichnis /var/lib/php7.0-fpm

Viele Grüße
Steffen

Hallo,

so, ich führe mal wieder meine Selbstgespräche zur Problemlösung bzw. zum Ziel :slight_smile:

ach so, das wird ja erst mit dem FPM-Socket erstellt.

Viele Grüße
Steffen

Hallo Steffen

endet mit

Job for php7.0-fpm.service failed because the control process exited with error code.

systemctl status php7.0-fpm.service
 php7.0-fpm.service - The PHP 7.0 FastCGI Process Manager
   Loaded: loaded (/lib/systemd/system/php7.0-fpm.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Tue 2020-03-17 18:25:05 CET; 2min 26s ago
     Docs: man:php-fpm7.0(8)
  Process: 13450 ExecStopPost=/usr/lib/php/php-fpm-socket-helper remove /run/php/php-fpm.sock /etc/php/7.0/fpm/pool.d/www.conf 70 (code=exited, status=0/SUCCESS)
  Process: 12710 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.0/fpm/pool.d/www.conf 70 (code=exited, status=0/SUCCESS)
  Process: 13427 ExecStart=/usr/sbin/php-fpm7.0 --nodaemonize --fpm-config /etc/php/7.0/fpm/php-fpm.conf (code=exited, status=78)
 Main PID: 13427 (code=exited, status=78)

Mär 17 18:25:05 afs-webserver systemd[1]: Starting The PHP 7.0 FastCGI Process Manager...
Mär 17 18:25:05 afs-webserver php-fpm7.0[13427]: [17-Mar-2020 18:25:05] ERROR: unable to bind listening socket for address '/var/lib/php7.0-fpm/moodle31.sock': No such file or directory (2)
Mär 17 18:25:05 afs-webserver php-fpm7.0[13427]: [17-Mar-2020 18:25:05] ERROR: FPM initialization failed
Mär 17 18:25:05 afs-webserver systemd[1]: php7.0-fpm.service: Main process exited, code=exited, status=78/n/a
Mär 17 18:25:05 afs-webserver systemd[1]: php7.0-fpm.service: Failed with result 'exit-code'.
Mär 17 18:25:05 afs-webserver systemd[1]: Failed to start The PHP 7.0 FastCGI Process Manager.

Es „auert“ mal wieder :wink:

Viele Grüße
Steffen

Hallo Steffen,

grundsätzlich kannst du ganz problemlos verschiedene PHP-Versionen nebeneinander installieren, das beeinflusst künftige Betriebssystemupdates nicht. Solange du schaust, dass du die Default-Version des Betriebssystems wieder zurückstellst, existieren die Versionen ohne Beeinträchtigung und sonstige Auswirkungen nebeneinander. Da muss nichts deinstalliert werden.

Was ich immer schauen würde, wenn ich andere Versionen installiere, ist, dass ich auch alle Erweiterungen, die benötigt werden, mit installiere. Schau was du für 7.2 installiert hast und mach dies einfach auch bei allen anderen Versionen, dann bist du für die Anforderungen deiner Moodles, Nextclouds usw. immer abgesichert. Ich zieh mir dafür die Liste einfach in Excel oder notepad++ sortiere mir das schön und ändere dann nur die PHP-Version für neue Installationen. Wenn was nicht oder nicht mehr vorhanden ist, sagt mir apt das schon.

Wie gesagt, ich nutze nur die Fremdrepo, da mir Ubuntu zu sehr hintendran hängt.

Viele Grüße

Steffen

Hallo Steffen,

dann sind evtl. noch nicht alle notwendigen Erweiterungen da, oder in der conf ist was falsch.

Ich installiere immer Folgendes:

sudo apt-get install php7.0 php7.0-bz2 php7.0-cgi php7.0-cli php7.0-common php7.0-curl php7.0-fpm php7.0-gd php7.0-intl php7.0-json php7.0-mbstring php7.0-mysql php7.0-opcache php7.0-readline php7.0-xml php7.0-zip php7.0-ldap php7.0-imap php7.0-pgsql php7.0-pspell php7.0-recode php7.0-soap php7.0-sqlite3 php7.0-tidy php7.0-xmlrpc php7.0-xsl

Viele Grüße

Steffen

Hallo Steffen,

hab was vergessen!

ich glaube der Prozess legt den Pfad zum Socket nicht selbstständig an.

Deshalb:

sudo mkdir -p /var/lib/php7.0-fpm

Das könnte das Problem auch lösen!

Viele Grüße

Steffen

Hallo Steffen,

das war’s wohl. Jetzt kam bei service php7.0-fpm restart keine Fehlermeldung mehr. Also einen Schritt weiter.

Viele Grüße
Steffen

Hallo,

da Moodle noch immer eine weiße leere Seite liefert, vermute ich, dass bei meiner Config noch was nicht stimmt:

Moodle liegt in /var/www/moodle und wird über https://server.unseredomain.de/moodle aufgerufen.
Das moodledata liegt in /var/www/moodledata

Viele Grüße
Steffen

Hallo Steffen,

auf Anhieb kann ich 2 Sachen in der conf sehen.

Die Zeile php_admin_value[open_basedir] = /var/www/moodle/web:/var/www/moodle/private:/var/www/moodle/tmp muss auf jeden Fall noch auf dich angepasst werden.

Mit den Infos, die ich von dir habe, könnte das wie folgt lauten:

php_admin_value[open_basedir] = /var/www/moodle:/var/www/moodledata:/var/www/moodle/tmp

Ich habe das als Beispiel genommen, da ich Seiten immer in folgende Ordnerstruktur packe:

/var/www/meineDomain/web
/var/www/meineDomain/private
/var/www/meineDomain/temp

Wobei web der root Ordner für den Zugang von außen ist und private der Datenordner für z.B. Moodledata oder nextclouddata.

In Zeile php_admin_value[sendmail_path] = „/usr/sbin/sendmail -t -i -f MAILADRESSE“ kannst du statt MAILADRESSE eine Mailadresse eintragen oder du lässt die ganze Zeile weg. Ist eh nur dafür da, bei Fehlern einen Mail zu verschicken.

Wichtig wäre jetzt, wie du dem virtuellen Host zu Moodle in Apache2 gesagt hast, dass er über PHP-FPM und deinen Socket gehen soll. Wie gesagt, da kann ich aber auf die Schnelle nicht helfen, da ich nginx nutze.

Viele Grüße

Steffen