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
?
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".
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.