I found strange behaviour concerning php
and /tmp
folder. Php uses another folder when it works with /tmp
. Php 5.6.7, nginx, php-fpm.
I execute the same script in two ways: via browser and via shell. But when it is launched via browser, file is not in real /tmp
folder:
<?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)
Where is the file? In /tmp
$ find / -name 185617.txt
/tmp/185617.txt
If access it via http://myserver.ru/script.php
I get
File /tmp/185212.txt
bool(true)
string(38) "CentOS Linux release 7.0.1406 (Core)
But where is the file?
$ find / -name 185212.txt
/tmp/systemd-private-nABCDE/tmp/185212.txt
Why does php thinks that /tmp
should be in /tmp/systemd-private-nABCDE/tmp
?
If you are running multiple sites on the server then I think you'll want to leave PrivateTmp=yes so that each site remains segregated even in it's use of temp files. Could be a security issue otherwise, I'd imagine.
Ignacio Vazquez-Abrams have the correct answer, but let me add my functional solution.
I've try "multi-user.target.wants" solution, it have worked but after restart, but at some point, PrivateTmp go back to true. Like my principal use of Apache2 is PHP, I finally edited php.ini and I've uncomment line sys_temp_dir.
By default system use temp dir assigned by function sys_get_temp_dir. Function sys_get_temp_dir will return "/tmp" but the truth is that your tmp files are storing at some path like /tmp/systemd-private-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-apache2.service-YYYYYY//tmp/*. So, what work for me was:
Edit php.ini (path can change between PHP versions)
Then uncomment sys_temp_dir line
Because systemd is configured to give nginx a private /tmp. If you must use the system /tmp instead for some reason then you will need to modify the .service file to read "PrivateTmp=no".