2015-05-25 4 views
14

Ich fand seltsames Verhalten bezüglich php und /tmp Ordner. PHP verwendet einen anderen Ordner, wenn es mit /tmp funktioniert. PHP 5.6.7, nginx, php-fpm.Php hat eine eigene/tmp in/tmp/systemd-private-NABCDE/tmp, wenn über nginx zugegriffen

Ich führe das gleiche Skript auf zwei Arten aus: über den Browser und über die Shell. Aber wenn es über den Browser gestartet wird, ist Datei nicht in Echt /tmp Ordner:

<?php 
$name = date("His"); 

echo "File /tmp/$name.txt\n"; 

shell_exec('echo "123" > /tmp/'.$name.'.txt'); 

var_dump(file_exists('/tmp/'.$name.'.txt')); 

var_dump(shell_exec('cat /etc/*release | tail -n 1')); 

php -f script.php

File /tmp/185617.txt 
bool(true) 
string(38) "CentOS Linux release 7.0.1406 (Core) 

Wo ist die Datei? In/tmp

$ find/-name 185617.txt 
/tmp/185617.txt 

Wenn der Zugriff darauf über http://myserver.ru/script.php I

File /tmp/185212.txt 
bool(true) 
string(38) "CentOS Linux release 7.0.1406 (Core) 

bekommen Aber wo ist die Datei?

$ find/-name 185212.txt 
/tmp/systemd-private-nABCDE/tmp/185212.txt 

Warum php denkt, dass /tmp in /tmp/systemd-private-nABCDE/tmp sein sollte?

Antwort

26

Weil systemd is configured to give nginx a private /tmp. Wenn Sie müssen verwenden Sie das System/tmp stattdessen aus irgendeinem Grund, dann müssen Sie die .Service-Datei ändern, um "PrivateTmp = no" zu lesen.

+3

Sie haben Recht, aber das ist 'php-fpm', nicht' nginx'. Ich habe die Datei '/ usr/lib/systemd/system/php-fpm.service' Zeile' PrivateTmp = true' in 'PrivateTmp = false' geändert. Jetzt benutzt php den richtigen '/ tmp'-Ordner. –

+1

wow das ist brilliant. genau das, was wir seit 2 Tagen gesucht haben :) –

1

Wenn Sie mehrere Websites auf dem Server ausführen, dann denke ich, dass Sie PrivateTmp = yes verlassen sollten, so dass jede Website getrennt bleibt, auch wenn sie temporäre Dateien verwendet. Könnte sonst ein Sicherheitsproblem sein, würde ich mir vorstellen.

Verwandte Themen