No tengo open_basedir, php puede acceder a / etc / usr / proc / home, etc ... pero no / tmp.
tmpfs es mount on / tmp (/ tmp type tmpfs (rw)) Esa es también la razón por la que quiero usar la carpeta / tmp.
Mis archivos son propiedad de http (usuario para nginx y php) y todos pueden leerlos.
sudo -u http cat /tmp/file
funciona pero no funciona nada dentro de un script php (como file_exist () o file ()).
editar: el error se muestra en el registro:
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: probé el problema de otra manera. hice
touch("/tmp/boo");
file_exist("/tmp/boo");
y file_exist devuelve true para que se cree el archivo. Luego vi dentro / tmp y no se puede encontrar ningún archivo "boo" allí. Eso es lo que tenía miedo, php no «ve» el punto de montaje. ¿Por qué es eso y cómo puedo solucionarlo?
/tmp/ydlw/pid
en/tmp
? Si no, entonces esa es la razón del mensaje de error.Respuestas:
Descubrí por qué, bueno, alguien me dio una pista global.
No es culpa de php o tmpfs. El culpable era systemd y su sistema de seguridad
PrivateTmp
.Para aquellos que tienen el mismo problema que yo, el servicio php (y probablemente algunos otros) tienen la
PrivateTmp
opcióntrue
en el script systemd (/usr/lib/systemd/system
).En ese caso,
/tmp
se crea un nuevo y se aísla del otro. Todos los datos guardados en el interior se eliminan una vez que se detiene el servicio.Es una medida de seguridad ya que
/tmp
puede contener mucha información confidencial y el script php no siempre es seguro.Para desactivar esto, simplemente copie el script dentro
/etc/systemd/system
(para evitar sobrescribir sus cambios después de una actualización) y configúreloPrivateTmp
enfalse
.También puede configurar dos o más servicios para compartir el mismo / tmp usando
JoinsNamespaceOf
.Para más información>
man systemd.exec
fuente