I have no open_basedir, php can access /etc /usr /proc /home etc… but not /tmp.
tmpfs is mount on /tmp (/tmp type tmpfs (rw)) That's also the reason I want to use the /tmp folder.
My files are owned by http (user for nginx and php) and readable by everyone.
sudo -u http cat /tmp/file
is working but anything inside a php script does not (like file_exist() or file()).
edit : the error show in log :
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: I tested the issue the other way. I made
touch("/tmp/boo");
file_exist("/tmp/boo");
and file_exist return true so the file is created. Then I watched inside /tmp and no "boo" file can be found there. That's what I was afraid, php do not «see» the mount point. Why is that and how can I fix that ?
I found off why, well, someone gave me the global hint.
It's neither the fault of php or tmpfs. The culprit was systemd and his security system
PrivateTmp
.For those who get in the same issue that I did, the service php (and probably some others) have the
PrivateTmp
option totrue
in the systemd script (/usr/lib/systemd/system
).In that case, a new
/tmp
is created and isolated from the other one. All the data save inside are deleted once the service is stopped.It's a security measure since
/tmp
can contain a lot a sensitive informations and php script are not always secure.To deactivate this, simply copy the script inside
/etc/systemd/system
(to avoid overwriting of your changes after an update) and setPrivateTmp
tofalse
.You can also set two or more services to share the same /tmp using
JoinsNamespaceOf
.For more information >
man systemd.exec