Je n'ai pas open_basedir, php peut accéder à / etc / usr / proc / home etc… mais pas / tmp.
tmpfs est monté sur / tmp (type / tmp tmpfs (rw)) C'est aussi la raison pour laquelle je veux utiliser le dossier / tmp.
Mes fichiers appartiennent à http (utilisateur pour nginx et php) et sont lisibles par tout le monde.
sudo -u http cat /tmp/file
fonctionne mais tout ce qui se trouve dans un script php ne fonctionne pas (comme file_exist () ou file ()).
modifier: l'erreur s'affiche dans le journal:
PHP Warning: file(/tmp/ydlw/pid): failed to open stream: No such file or directory in /srv/http/ydlw/status.php on line 267
edit2: J'ai testé le problème dans l'autre sens. J'ai fait
touch("/tmp/boo");
file_exist("/tmp/boo");
et file_exist renvoie true pour que le fichier soit créé. Ensuite, j'ai regardé dans / tmp et aucun fichier "boo" ne peut être trouvé là-bas. C'est ce que j'avais peur, php ne «voit» pas le point de montage. Pourquoi est-ce et comment puis-je résoudre ce problème?
/tmp/ydlw/pid
existe- t- il dans/tmp
? Sinon, c'est la raison du message d'erreur.Réponses:
J'ai découvert pourquoi, eh bien, quelqu'un m'a donné un indice global.
Ce n'est ni la faute de php ni de tmpfs. Le coupable était systemd et son système de sécurité
PrivateTmp
.Pour ceux qui rencontrent le même problème que moi, le service php (et probablement quelques autres) a la
PrivateTmp
possibilité de le fairetrue
dans le script systemd (/usr/lib/systemd/system
).Dans ce cas, un nouveau
/tmp
est créé et isolé de l'autre. Toutes les données enregistrées à l'intérieur sont supprimées une fois le service arrêté.C'est une mesure de sécurité car
/tmp
peut contenir beaucoup d'informations sensibles et les scripts php ne sont pas toujours sécurisés.Pour désactiver cela, copiez simplement le script à l'intérieur
/etc/systemd/system
(pour éviter d'écraser vos modifications après une mise à jour) et réglezPrivateTmp
surfalse
.Vous pouvez également définir deux services ou plus pour partager le même / tmp à l'aide
JoinsNamespaceOf
.Pour plus d'informations>
man systemd.exec
la source