Ответ 1
Потому что systemd настроен для предоставления nginx private/tmp. Если вы по какой-то причине должны использовать систему /tmp, вам нужно будет изменить файл .service, чтобы прочитать "PrivateTmp = no".
Я нашел странное поведение относительно папки php
и /tmp
. Php использует другую папку, когда она работает с /tmp
. Php 5.6.7, nginx, php-fpm.
Я выполняю тот же script двумя способами: через браузер и через оболочку. Но когда он запускается через браузер, файл не находится в реальной папке /tmp
:
<?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)
Где находится файл? В /tmp
$ find / -name 185617.txt
/tmp/185617.txt
Если доступ к нему через http://myserver.ru/script.php
, я получаю
File /tmp/185212.txt
bool(true)
string(38) "CentOS Linux release 7.0.1406 (Core)
Но где файл?
$ find / -name 185212.txt
/tmp/systemd-private-nABCDE/tmp/185212.txt
Почему php считает, что /tmp
должен быть в /tmp/systemd-private-nABCDE/tmp
?
Потому что systemd настроен для предоставления nginx private/tmp. Если вы по какой-то причине должны использовать систему /tmp, вам нужно будет изменить файл .service, чтобы прочитать "PrivateTmp = no".
Если вы работаете с несколькими сайтами на сервере, я думаю, вы захотите оставить PrivateTmp = yes, чтобы каждый сайт оставался разделенным даже в нем, используя временные файлы. Возможно, это проблема безопасности.
Игнасио Васкес-Абрамс имеет правильный ответ, но позвольте мне добавить свое функциональное решение.
Я пробовал решение "multi-user.target.wants", оно работало, но после перезапуска, но в какой-то момент PrivateTmp вернулось к истине. Как и мое основное использование Apache2 - это PHP, я наконец отредактировал php.ini и удалил комментарий sys_temp_dir.
По умолчанию система использует временный каталог, назначенный функцией sys_get_temp_dir. Функция sys_get_temp_dir вернет "/tmp", но правда в том, что ваши tmp файлы хранятся по какому-либо пути, например /tmp/systemd-private-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-apache2.service-YYYYYY//tmp/*. Итак, что для меня было работой:
Отредактируйте php.ini (путь может меняться между версиями PHP)
sudo nano /etc/php/7.2/cli/php.ini
Затем раскомментируйте строку sys_temp_dir
; Directory where the temporary files should be placed.
; Defaults to the system default (see sys_get_temp_dir)
sys_temp_dir = "/tmp"