Probleme beim Zugriff auf /tmp mit sys get temp dir(), tmpfile() oder tempnam(): Unterschied zwischen den Versionen
Aus Contao Community Documentation
Tril (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „{{DISPLAYTITLE:Probleme beim Zugriff auf /tmp mit sys_get_temp_dir(), tmpfile() oder tempnam()}} Category:Fehlersuche Category:Admin HOWTOS <code>sys_get…“) |
(kein Unterschied)
|
Version vom 28. März 2013, 13:06 Uhr
sys_get_temp_dir()
wird innerhalb von Contao kaum verwendet, dennoch kann es zu Problemen mit Anwendungen Dritter kommen, die sys_get_temp_dir()
verwenden. Neuerdings kommen die Shared-Hoster auf die Idee, den Zugriff auf /tmp
(Defaultwert von sys_get_temp_dir()
) aus PHP heraus zu sperren. Jedoch vergessen einige auch, einen alternativen Pfad zu setzen. Dies führt nicht selten zu "open_basedir restriction in effect" oder "access denied" Fehlern, wenn eine Anwendung versucht, mittels sys_get_temp_dir()
das temporäre Verzeichnis zu ermitteln und Dateien dort drin abzulegen, zu lesen und zu verändern.
Hinweis: Die Funktionen tmpfile() und tempnam() sind indirekt betroffen, weil diese intern sys_get_temp_dir() verwenden!
|
Einige Hoster weisen die Schuld von sich und behaupten, es liegt am Programm. In Wirklichkeit liegt hier ein Konfigurationsfehler vor, weil das Setup des Hosters essentielle Funktionen von PHP unbrauchbar macht. Um das Problem zu beheben gibt es mehrere Möglichkeiten.
Inhaltsverzeichnis
Grundlagen - wie wird sys_get_temp_dir()
konfiguriert
Zuerst einmal muss man wissen, welchen Pfad man verwenden sollte. Das ist ganz abhängig vom Hoster, manche haben separate Pfade für die einzelnen Hostings, z.B. /var/www/clients/clientX/webY/tmp
. Dieser Pfad ist beim Hoster anzufragen!
Alternativ kann man auch das temporäre Verzeichnis von Contao verwenden, dieses befindet sich innerhalb einer Contao Installation in /system/tmp
.
PHP <5.3.8 <5.4.0, <5.4.3
In älteren aber immer noch weit verbreiteten PHP Versionen bezieht PHP den Systemweiten Temp-Pfad aus den Umgebungsvariablen TEMP
, TMP
und TMPDIR
.
Diese müssen auf den richtigen Pfad gesetzt werden.
PHP >=5.3.8 >=5.4.0, >=5.4.3
Ab PHP 5.3.8+ 5.4.0+, 5.4.3+ gibt es eine php.ini Einstellung system_tmp_dir
(https://bugs.php.net/bug.php?id=60524).
Diese ist Analog zu upload_tmp_dir
und session.save_path
eingeführt worden.
sys_get_temp_dir() konfigurieren
PHP als FCGI (Apache2)
Wird PHP als FCGI Prozess ausgeführt, lassen sich die Umgebungsvariablen im FCGI-Init-Script definieren:
export TEMP=/path/to/contao/system/tmp export TMP=/path/to/contao/system/tmp export TMPDIR=/path/to/contao/system/tmp
PHP als mod_php (Apache2)
Wird PHP mittels mod_php (oder auch mod_suphp) ausgeführt, lassen sich die Umgebungsvariablen in der .htaccess definieren, dafür ist allerdings das Apache Modul SetEnv erforderlich:
SetEnv TEMP /path/to/contao/system/tmp SetEnv TMP /path/to/contao/system/tmp SetEnv TMPDIR /path/to/contao/system/tmp
php.ini (nur PHP >=5.3.8 >=5.4.0, >=5.4.3)
In neueren PHP Versionen lässt sich das Problem durch setzen der Direktive system_tmp_dir
beheben, dies geht je nach Setup und Möglichkeiten des Hosters über 2 unterschiedliche Wege:
via Apache Konfiguration
Manche Hoster ermöglichen es, individuelle Apache Einstellungen zu setzen.
php_admin_value system_tmp_dir /path/to/contao/system/tmp
Achtung: system_tmp_dir gehört zur Gruppe der PHP_INI_SYSTEM Direktiven und kann daher nicht in der .htaccess gesetzt werden!
|
via php.ini
Manche Hoster ermöglichen es, individuelle php.ini Einstellungen zu setzen.
system_tmp_dir=/path/to/contao/system/tmp
putenv() in PHP (geht immer)
Wenn nichts mehr hilft, kann man zur Not die Umgebungsvariablen via putenv()
zur Laufzeit setzen. Dafür legt man in Contao eine /system/config/initconfig.php
an (wenn nicht schon vorhanden) und fügt folgende Zeilen ein:
putenv('TMP=' . TL_ROOT . '/system/tmp'); putenv('TEMP=' . TL_ROOT . '/system/tmp'); putenv('TMPDIR=' . TL_ROOT . '/system/tmp');
(Tristan Lins)