Apache仍然在用不正确的权限服务PHP文件


Apache still serving PHP file with incorrect permissions

我试图理解为什么Apache仍然能够在我设置权限000并赋予文件根所有权后提供PHP文件。

如果我创建一个权限为644的PHP文件,它的服务是正确的。如果我随后将权限更改为000,并将所有权更改为root,那么该文件仍然可以使用,但我认为不应该这样!

如果我重新启动Apache,文件不会被服务。我得到一个500,错误日志抱怨无法打开文件,这正是我所期望的行为。

重新启动后,当文件不被服务时,如果我将所有权更改回webserver并将权限更改回644,文件将再次被服务,而不需要重新启动apache。

此行为仅对PHP文件有效。HTML文件的行为就像我所期望的那样,一旦你删除了权限,文件就不会被服务。

有人向我建议Apache可能在PHP文件上维护一个文件句柄,并且直到重新启动才看到权限更改。我尝试在文件上使用lsof,但没有看到任何打开的文件描述符。

我也尝试和实验,我开始与web服务器所有权和644权限,并检查文件可以服务。然后我重命名文件,将权限更改为000,所有权更改为root,然后将文件移回来。在此之后,该文件仍然是Apache提供的

谁能解释一下这里发生了什么?

最有可能发生的事情是您正在运行opcache。PHP在运行时自行编译。为了节省开销,PHP 5.5或更高版本有Opcache,它可以节省编译步骤。Apache可能在缓存文件。然后Apache将使用自己的权限存储缓存文件。Apache也可能在内存中缓存它。当您重新启动Apache时,它必须返回到基本PHP文件,它不再具有权限。