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

use*_*519 2 php fopen unlink fclose

为什么打开的文件被删除?在 Windows Xamp 上,我收到消息“仍在工作”,但在其他 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";
?>
Run Code Online (Sandbox Code Playgroud)

dec*_*eze 6

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

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

换句话说,您基本上可以随时将文件标记为删除,但只要应用程序仍在访问它,系统实际上就会保留它。只有当所有应用程序都释放了该文件时,它才会最终被真正删除。Windows 显然不会那样做。更新: 从 PHP 7.3 开始,现在可以unlink打开文件。

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