php脚本不能访问/ tmp文件夹

我没有open_basedir,PHP可以访问/ etc / usr / proc / home等…但不是/ tmp

tmpfs挂载在/ tmp(/ tmptypestmpfs(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 

编辑2:我testing了另一种方式的问题。 我做了

 touch("/tmp/boo"); file_exist("/tmp/boo"); 

file_exist返回true,所以文件被创build。 然后我看了/ tmp里面没有“boo”文件可以在那里find。 这就是我害怕,PHP不“看”挂载点。 为什么是这样的,我该如何解决这个问题?

我发现为什么有人给了我全球的暗示。

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

对于那些遇到同样问题的人,服务php(也可能是其他人)在systemd脚本( /usr/lib/systemd/system )中将PrivateTmp选项设置为true

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

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

要取消激活,只需复制/etc/systemd/system的脚本(以避免在更新后覆盖更改)并将PrivateTmp设置为false

你也可以设置两个或多个服务来使用JoinsNamespaceOf共享相同的/ tmp。

有关更多信息,请参阅man systemd.exec