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

eep*_*yne 21 php tmp tmpfs file-permissions centos7

我没有 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
Run Code Online (Sandbox Code Playgroud)

编辑2:我以另一种方式测试了这个问题。我做了

touch("/tmp/boo");
file_exist("/tmp/boo");
Run Code Online (Sandbox Code Playgroud)

和 file_exist 返回 true 以便创建文件。然后我在 /tmp 里面看了看,在那里找不到“boo”文件。这就是我所害怕的,php 看不到挂载点。为什么会这样,我该如何解决?

eep*_*yne 37

我找到了为什么有人给了我全局提示。

这既不是 php 也不是 tmpfs 的错。罪魁祸首是 systemd 和他的安全系统PrivateTmp

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

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

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

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

您还可以设置两个或多个服务来共享相同的 /tmp 使用JoinsNamespaceOf.

欲了解更多信息 > man systemd.exec

  • 谢谢你!我花了一整天的时间试图弄清楚这一点。我的大脑正在从我的鼻子上融化,因为我如此努力地想弄清楚这一点。 (4认同)