我试图理解为什么在我设置权限000并赋予文件root权限后,Apache仍能够提供PHP文件。
如果我创建一个拥有权限644的网络服务器所拥有的PHP文件,则其服务正确。如果我然后将权限更改为000并将所有权更改为root,则仍然会提供该文件,但我不认为它应该是!
如果我然后重新启动Apache,则不会提供该文件。我得到500并且错误日志抱怨无法打开文件,这正是我期望的行为。
重新启动后,当文件未被提供时,如果我将所有权更改回网络服务器并将权限更改回644,则会再次提供该文件,而无需重新启动apache。
此行为仅适用于PHP文件。 HTML文件的行为与我期望的一样,只要您删除权限,就不会提供文件。
有人告诉我,Apache可能正在维护PHP文件的文件句柄,并且在重新启动之前它没有看到权限更改。我尝试在文件上使用lsof,但没有看到任何打开的文件描述符。
我还尝试并试验了我从哪里开始使用网络服务器所有权和644权限,并检查了文件是否可以提供服务。然后我重命名了该文件,将权限更改为000并将所有权更改为root,然后将文件移回。在此之后,该文件仍然由Apache提供。
任何人都可以了解这里发生的事情吗?
答案 0 :(得分:5)
最有可能发生的事情是你有运行opcache。 PHP在运行时编译自己。为了节省开销,PHP 5.5或更高版本具有Opcache,这保存了编译步骤。所以Apache可能正在缓存该文件。然后,Apache将使用自己的权限存储缓存文件。 Apache也可能在内存中缓存它。当你重新启动Apache时,它必须返回到基本的PHP文件,它不再具有权限。