Назад | Перейти на главную страницу

php скрипт не может получить доступ к папке / tmp

У меня нет 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 не «видит» точку монтирования. Почему это так и как это исправить?

Я выяснил, почему, ну, кто-то дал мне глобальный намек.

Это не вина ни php, ни tmpfs. Виновником был systemd и его система безопасности. PrivateTmp.

Для тех, кто сталкивается с той же проблемой, что и я, служба php (и, возможно, некоторые другие) имеют PrivateTmp возможность true в скрипте systemd (/usr/lib/systemd/system).

В этом случае новый /tmp создан и изолирован от другого. Все данные, сохраненные внутри, удаляются после остановки службы.

Это мера безопасности, поскольку /tmp может содержать много конфиденциальной информации, а скрипт php не всегда безопасен.

Чтобы отключить это, просто скопируйте скрипт внутри /etc/systemd/system (чтобы избежать перезаписи ваших изменений после обновления) и установите PrivateTmp к false.

Вы также можете настроить две или более службы для совместного использования одного / tmp, используя JoinsNamespaceOf.

Для получения дополнительной информации> man systemd.exec