为什么在打开的文件上取消链接成功


Why is unlink successful on an open file?

为什么要删除打开的文件?在WindowsXamp上,我得到消息"仍然工作",但在其他PHP服务器文件被删除,即使它是打开的,我得到的消息"文件删除"。我也可以从FTP中删除文件,即使第一个脚本仍在工作:(

<?php
$handle = fopen("resource.txt", "x");
sleep(10);
?>

<?php
if (file_exists("resource.txt") && @unlink("resource.txt") === false) {
    echo "still worning";
    exit;
}
else
    echo "file deleted";
?>

UNIX系统通常允许您这样做,是的。底层的C unlink函数记录如下:

unlink()函数从其目录中删除按路径命名的链接并递减由链接如果该递减将文件的链接计数减少到零,并且没有进程打开该文件,则所有与该文件关联的资源被回收。如果一个或多个进程在上次链接被删除,链接被删除了,但文件的删除延迟,直到所有对它的引用都已关闭。

换句话说,你基本上可以在任何时候标记文件以删除,但只要应用程序仍在访问,系统就会一直保留它。只有当所有应用程序都放弃了文件时,它才会最终被删除。Windows显然是而不是那样做的更新:从PHP 7.3开始,现在可以unlink打开文件。

附带说明一下,UNIX的行为是多进程环境中唯一正常的行为。如果你必须等待所有进程关闭对文件的访问,然后系统才允许你删除它,那么基本上根本不可能删除经常访问的文件。是的,这就是关于"无法删除文件,仍在使用中,重试?"的Windows对话框的来源,您永远无法摆脱这些对话框。