У меня нет 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