Php имеет свой собственный /tmp в/tmp/systemd-private-nABCDE/tmp при доступе через nginx

Я нашел странное поведение относительно папки 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?

Ответы

Ответ 2

Если вы работаете с несколькими сайтами на сервере, я думаю, вы захотите оставить PrivateTmp = yes, чтобы каждый сайт оставался разделенным даже в нем, используя временные файлы. Возможно, это проблема безопасности.

Ответ 3

Игнасио Васкес-Абрамс имеет правильный ответ, но позвольте мне добавить свое функциональное решение.

Я пробовал решение "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"