php 脚本无法访问 /tmp 文件夹

php 脚本无法访问 /tmp 文件夹

我没有 open_basedir,php 可以访问 /etc /usr /proc /home 等……但不能访问 /tmp。

tmpfs 挂载在 /tmp 上(/tmp 类型 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 无法“看到”挂载点。为什么会这样?我该如何修复?

答案1

我找到了原因,嗯,有人给了我全局提示。

这不是 php 或 tmpfs 的错误。罪魁祸首是 systemd 及其安全系统PrivateTmp

对于那些遇到与我相同问题的人,服务 php(可能还有其他一些服务)可以PrivateTmp选择true在 systemd 脚本中(/usr/lib/systemd/system)。

在这种情况下,/tmp将创建一个新的并与另一个隔离。一旦服务停止,其中保存的所有数据都将被删除。

这是一种安全措施,因为它/tmp可以包含很多敏感信息,而且 php 脚本并不总是安全的。

要停用此功能,只需复制里面的脚本/etc/systemd/system(以避免更新后覆盖更改)并设置PrivateTmpfalse

您还可以使用 将两个或多个服务设置为共享同一个 /tmp JoinsNamespaceOf

更多信息 >man systemd.exec

相关内容