У меня нет open_basedir, php может получить доступ к / etc / usr / proc / home и т. Д., Но не к / tmp.
tmpfs монтируется в / tmp (/ tmp type tmpfs (rw)). Это также причина, по которой я хочу использовать папку / tmp.
Мои файлы принадлежат http (пользователь для nginx и php) и доступны для чтения всем.
sudo -u http cat /tmp/file
работает, но ничего внутри скрипта php не работает (например, file_exist () или file ()).
редактировать: ошибка показывает в журнале:
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: я проверил проблему другим способом. я сделал
touch("/tmp/boo");
file_exist("/tmp/boo");
и file_exist возвращает true, поэтому файл создается. Затем я посмотрел внутри / tmp, и там нет файла "boo". Вот чего я боялся, php не «видит» точку монтирования. Почему это и как я могу это исправить?
/tmp/ydlw/pid
в/tmp
? Если нет, то это причина сообщения об ошибке.Ответы:
Я выяснил, почему, ну, кто-то дал мне глобальный намек.
Это не вина php или tmpfs. Виновником был системный и его система безопасности
PrivateTmp
.Для тех, кто попадает в ту же проблему, что и я, сервис php (и, возможно, некоторые другие) имеют
PrivateTmp
возможностьtrue
в сценарии systemd (/usr/lib/systemd/system
).В этом случае новое
/tmp
создается и изолируется от другого. Все данные, сохраненные внутри, удаляются после остановки службы.Это мера безопасности, поскольку она
/tmp
может содержать много конфиденциальной информации и php-скрипт не всегда безопасен.Чтобы отключить это, просто скопируйте скрипт внутри
/etc/systemd/system
(чтобы избежать перезаписи изменений после обновления) и установитеPrivateTmp
вfalse
.Вы также можете установить две или более служб для использования одного и того же / tmp
JoinsNamespaceOf
.Для получения дополнительной информации>
man systemd.exec
источник