Liste der Anhänge anzeigen (Anzahl: 1)
Installation im Shared Hosting bei HostEurope: Fehlermeldung und Workaround
Beim Versuch, Contao 4.2.3 auf einem WebPack bei HostEurope zu installieren, bekam ich schon während der Ausführung des Install-Scripts folgende Fehlermeldung:
PHP Fatal error: Uncaught exception 'Symfony\\Component\\Filesystem\\Exception\\IOExce ption' with message 'The directory "/tmp" is not writable.' in [...]/vendor/symfony/symfony/src/Symfony/Component/Filesystem/LockHandler.php:50 [...]
Hier möchte ich die Ergebnisse meiner Nachforschungen mitteilen, wodurch dieser Fehler zustande kommt und wie man ihn umgehen kann. Vielleicht hat ja jemand mal dasselbe Problem. Ich nehme an, dass es auf allen Paketen im Shared Hosting bei HostEurope besteht.
Fehleranalyse
Der Fehler kommt wie folgt zustande:
- Während der Installation von Contao wird die LockHandler-Funktion von Symfony aufgerufen.
- Der LockHandler versucht, mithilfe der Funktion sys_get_temp_dir() das temporäre Verzeichnis zu ermitteln, um dort eine Lock-Datei abzulegen.
- Die Funktion sys_get_temp_dir() liefert den Pfad "/tmp" zurück.
- Das Verzeichnis "/tmp" ist jedoch bei HostEurope aus Sicherheitsgründen so konfiguriert, dass der PHP-Prozess keinen Schreibzugriff darauf hat.
- Der Schreibversuch des LockHandlers schlägt fehl und die Installation bricht mit der genannten Fehlermeldung ab.
Der Kern des Problems ist Punkt 3. Eigentlich sollte die Funktion sys_get_temp_dir() ein Verzeichnis zurückgeben, das auch von PHP beschreibbar ist. Dass sie dies nicht tut, liegt daran, dass HostEurope die PHP-Direktive sys_temp_dir nicht konfiguriert hat. Das ist erstaunlich, weil HostEurope im KIS unter "Allgemeine Informationen" ein benutzerspezifisches Tmp-Verzeichnis der Form "/is/htdocs/user_tmp/wp.../" angibt, auf das der PHP-Prozess Schreibzugriff hat. Nur ist dieses Verzeichnis eben nicht in der Direktive sys_temp_dir konfiguriert. Komischerweise ist es jedoch in der Direktive upload_tmp_dir konfiguriert, wie man sehen kann, wenn man sich die PHP-Konfiguration per phpinfo() ausgeben lässt:
Anhang 18495
Ich versuche gerade, HostEurope dazu zu bewegen, die Direktive sys_temp_dir genauso zu konfigurieren wie upload_tmp_dir, bisher leider ohne Erfolg.
Workaround
Das Problem ist in allgemeiner Form hier beschrieben: https://de.contaowiki.org/Probleme_b...oder_tempnam(). Dort werden auch Lösungen vorgeschlagen, von denen allerdings die meisten bei HostEurope nicht funktionieren. Die einzige Lösung, die (in modifizierter Form) funktioniert, ist die letzte im obigen Artikel genannte, nämlich das Setzen der Umgebungsvariable 'TMPDIR' zur Laufzeit. Konkret heißt das für die Installation von Contao 4.2, dass man noch vor dem Aufruf des Installations-Skripts irgendwo die Zeile
PHP-Code:
putenv('TMPDIR=/is/htdocs/user_tmp/wp.../');
einfügen muss, wobei man hier den im KIS angegebenen benutzerspezifischen Pfad angeben muss.
Wo kann man diesen Code unterbringen? Die naheliegendste Option wäre in der /system/config/localconfig.php, weil diese bei Updates nicht überschrieben wird. Das Dumme ist nur, dass die "klassischen" Contao-Konfigurationsdateien in Contao 4.2 während der Installationsroutine generiert werden und also vorher noch gar nicht zur Verfügung stehen. Man muss also den Code zunächst vor Aufruf des Installationstools in die web/install.php oder die app/autoload.php schreiben und dann nach Ende der Installationsroutine in die localconfig.php verschieben.
Falls jemand eine bessere Lösung kennt, wäre ich sehr daran interessiert, sie zu hören!
Workaround Hosteurope Eintrag
Wo hast du das eingetragen?
Liste der Anhänge anzeigen (Anzahl: 1)
Hab nun folgendes gemacht:
1. Ticket bei Host Europe
wie ein Wunder geht es nun ohne /tmp/ Meldung weiter und ich komme bis zum "Contao installieren" Schritt.
Dort geht es dann aber nicht mehr weiter :-(
Anhang 21422
Also versuche ich nun:
https://community.contao.org/de/show...0%A6h%C3%A4ngt
Was übrigens nur bis zu der Version geht, weil die weiteren nicht zum Download bereit stehen.