Php dispose de sa propre /tmp dans le répertoire /tmp/systemd-privé-nABCDE/tmp quand on y accède via nginx
J'ai trouvé étrange comportement concernant php
et /tmp
dossier. Php utilise un autre dossier, quand il travaille avec /tmp
. Php 5.6.7, nginx, php-fpm.
J'exécute le même script de deux manières: via un navigateur et via le shell. Mais quand il est lancé via un navigateur, le fichier n'est pas dans la vraie /tmp
dossier:
<?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 l'accès via http://myserver.ru/script.php
- je obtenir
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 que /tmp
devrait être dans /tmp/systemd-private-nABCDE/tmp
?
Vous devez vous connecter pour publier un commentaire.
Parce que systemd est configuré pour donner nginx privé /tmp. Si vous doit utiliser le système de /tmp plutôt que pour une raison quelconque, alors vous devrez modifier le .service fichier à lire "PrivateTmp=no".
php-fpm
, pasnginx
. J'ai changé le fichier/usr/lib/systemd/system/php-fpm.service
lignePrivateTmp=true
enPrivateTmp=false
. Maintenant, php utilise corriger/tmp
dossier./tmp
peuvent contenir des informations sensibles et tous les scripts php peuvent soudainement avoir accès à cette information.Si vous exécutez plusieurs sites sur le serveur alors je pense que vous aurez envie de laisser PrivateTmp=oui, de sorte que chaque site reste séparé, même dans l'utilisation de fichiers temporaires. Peut être un problème de sécurité sinon, j'imagine.
Ignacio Vazquez-Abrams ont trouvé la bonne réponse, mais permettez-moi d'ajouter ma solution fonctionnelle.
J'ai essayer "multi-utilisateur.cible.veut" solution, il ont travaillé, mais après le redémarrage, mais à un certain point, PrivateTmp revenir à la vraie.
Comme mon utilisation principale de Apache2, PHP, j'ai finalement modifié le php.ini et j'ai décommentez la ligne sys_temp_dir.
Par défaut d'utilisation du système de temp dir attribué par la fonction sys_get_temp_dir. Fonction sys_get_temp_dir sera de retour "/tmp", mais la vérité est que vos fichiers tmp sont le stockage à un certain chemin comme /tmp/systemd-privé-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-apache2.service-AAAAAA//tmp/*. Ainsi, ce travail a été pour moi:
Modifier php.ini (chemin peut changer entre les versions de PHP)
Puis décommenter sys_temp_dir ligne