PHP unlink 延迟

5

我在使用unlink函数时遇到了一些问题。

我有一个网页,当它被刷新时会搜索新增文件的目录。用户可以选择管理文件,并删除任意文件。然而,当用户删除文件时,实际上需要大约5秒钟才能从服务器目录中删除该文件。在此期间,如果用户刷新浏览器,该文件将重新出现为新文件。这个问题在于,如果用户再次删除这个文件,由于最初的延迟,文件已经不存在了...

对此有什么想法吗?这让我疯掉了,不知道该怎么解决这个问题...


1
它真的被删除了,但浏览器从缓存中获取到目录的版本,这可能是吗? - Håkan
并不是因为我亲眼看到文件从文件夹中被删除,而且需要近5秒钟才会消失... - Dimitri
1
clearstatcache(); 的文档在这里:http://php.net/manual/zh/function.clearstatcache.php - Orangepill
我不确定 clearstatcache() 会有所帮助。unlink() 没有出现在受影响函数列表中,并且有这样一个明确的注释:unlink() 会自动清除缓存。 - George Cummins
Dimitri,这是服务器配置问题的可能性大吗?您是否使用RAID或任何缓冲方式来介于PHP和文件系统之间? - George Cummins
显示剩余4条评论
2个回答

1

一种解决方案是在调用unlink()时创建一个新文件,并将新文件命名为$original_filename."_deleted"。然后在列出文件时,排除任何以"_deleted"结尾的文件。接下来,您只需要定期使用cron作业清理所有"_deleted"文件。

    function my_unlink($filename){
      touch($filename.'_deleted');
      unlink($filename);
    }

    function list_files(){
      if ($handle = opendir('.')) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != ".." && !preg_match('/_deleted$/',$entry)) {
                echo "$entry\n";
            }
        }
        closedir($handle);
      }
    }

有趣的方法,我会看一下。 - Dimitri

0

clearstatchache(true, $file) 还是值得一试的,尽管在 unlink 的文档中我持悲观态度。

也许目录中有太多文件了,使用几个目录可能会有所帮助(使用文件名前两个字符的目录)。

然而,我的希望是列表概述页面已被缓存。使用

header("Cache-Control: no-cache, must-revalidate");

或许可以帮助。


我会尝试并查看。文件夹中大约有100个PDF文件,所有文件大小均小于4 MB。每当有新文件进来时,一个函数会读取文件夹并在访问页面后将文件名添加到数据库中。 - Dimitri
100个文件不应该减慢目录扫描速度。(我假设您没有备份/镜像运行。) - Joop Eggen
这也是我想的,100个文件并不算多,也许文件太大了,需要更长时间。即使如此,在通知用户之前,该过程仍然需要完全完成。也许可以在某个地方加入延迟? - Dimitri
1
你也可以通过硬件来解决问题,例如使用固态硬盘而不是机械硬盘可能会有所帮助。 - Mark Tomlin
是的,我可能最终会修改一些硬件。我正在考虑将硬盘替换为固态硬盘。 - Dimitri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接