web-dev-qa-db-fra.com

Php a son propre/tmp dans/tmp/systemd-private-nABCDE/tmp en cas d'accès via nginx

J'ai trouvé un comportement étrange concernant le dossier php et /tmp. Php utilise un autre dossier quand il fonctionne avec /tmp. Php 5.6.7, nginx, php-fpm. 

J'exécute le même script de deux manières: via navigateur et via Shell. Mais quand il est lancé via un navigateur, le fichier n'est pas dans le vrai dossier /tmp:

<?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)

Où est le fichier? Dans/tmp

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

Si vous y accédez via http://myserver.ru/script.php je reçois

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

Mais où est le fichier? 

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

Pourquoi php pense-t-il que /tmp devrait être dans /tmp/systemd-private-nABCDE/tmp?

17
shukshin.ivan

Parce que systemd est configuré pour donner à nginx un/tmp privé. Si vous devez utiliser plutôt le système/tmp pour une raison quelconque, vous devrez modifier le fichier .service afin qu'il se lise "PrivateTmp = no".

31

Si vous utilisez plusieurs sites sur le serveur, je pense que vous voudrez laisser PrivateTmp = yes afin que chaque site reste séparé même s'il utilise des fichiers temporaires. Pourrait être un problème de sécurité sinon, j'imagine.

1
Artis