Probleme beim Zugriff auf /tmp mit sys_get_temp_dir(), tmpfile() oder tempnam()

Aus Contao Community Documentation


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.png Hinweis: Die Funktionen tmpfile() und tempnam() sind indirekt betroffen, weil diese intern sys_get_temp_dir() verwenden!


Anmerkung.png Anmerkung: Es handelt sich hierbei definitiv um einen Konfigurationsfehler des Hosters!
(Tristan Lins)


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.

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.5

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.


Achtung.png Achtung: Es gibt Berichte dass es ausreichend sei die Umgebungsvariable TMPDIR zu setzen, es ist aber sicherer alle 3 Umgebungsvariablen zu setzen, weil in älteren PHP Versionen wohl auf diese zurück gegriffen wurde.


PHP >=5.5

Ab PHP 5.5 gibt es eine php.ini Einstellung sys_temp_dir (http://de2.php.net/manual/en/ini.list.php). Diese ist Analog zu upload_tmp_dir und session.save_path eingeführt worden.

Hinweis: Laut einem Bug Report sollte diese Einstellung als system_tmp_dir bereits in PHP 5.3.8+ 5.4.0+, 5.4.3+ eingeführt werden, wurde aber erst in 5.5 eingeführt (https://bugs.php.net/bug.php?id=60524).

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 sys_temp_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 sys_temp_dir /path/to/contao/system/tmp


Achtung.png Achtung: sys_temp_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.

sys_temp_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');
Ansichten
Meine Werkzeuge

Contao Community Documentation

Andreas, leg dich da hinten hin und schlaf, dann kommen wir vorwaerts.

Tristan Lins
Navigation
Verstehen
Verwenden
Entwickeln
Verschiedenes
Werkzeuge