【问题标题】:PHP can't unlink file after fclosefclose后PHP无法取消链接文件
【发布时间】:2017-05-06 05:17:13
【问题描述】:

脚本完成后,我可以删除该文件,但在运行时我无法触摸它,即使在fclose() 之后也是如此。这是我尝试使用的代码:

    $Files = glob("$_SERVER[DOCUMENT_ROOT]/files/*.csv");

    $File = fopen($Files[0], "r");        

    //while (($Data = fgetcsv($File)) !== false) {...

    $i = 0;
    while (is_resource($File)) {
        $i && sleep(1);
        echo "Closing handle.\n";
        fclose($File);
        if (++$i > 5)
            die("Could not close handle.");
    }

foreach ($Files as $File) {
    $i = 0;
    while (file_exists($File)) {
        $i && sleep(1);
        echo "Deleting file.\n";
        @unlink($File);
        echo 'www-data@debian:~$ ', $Command = "rm -f '$File' 2>&1", "\n", shell_exec($Command);
        if (++$i > 5)
            die("Could not delete the file.");
    }
}

如您所见,我正在尝试通过 unlink() 删除它并使用 shell 命令,但两者都不起作用,都给我这个错误:

rm: 无法移除 '无敌文件.csv': 文本文件忙

我也意识到这个脚本可能有点矫枉过正,但这纯粹是因为我无法让它以任何方式工作,并且一些额外的代码只是为了输出目的而尝试调试正在发生的事情。

【问题讨论】:

  • $Files的内容是什么?此外,您使用带有“r”模式的fopen 进行读取,并且您稍后尝试删除该文件。您确定用户有权删除吗?可能是权限问题。尝试在没有任何其他代码的情况下执行unlink
  • 删除unlink之前的@,这样你就可以让php告诉你失败的原因。另外,检查fclose的返回值。
  • @KodosJohnson 感谢您到目前为止对我的帮助,我将尝试您的 unlink 完全不使用 fopen,并且我在示例中添加了更多代码,希望我'我没有错过任何更重要的部分
  • @chiliNUT 我已经这样做了,我的 xdebug 输出给出了同样的错误
  • @KodosJohnson 如果我删除 fopen 等,它会删除所有文件而没有任何问题。只有当我使用 PHP 脚本打开和关闭文件时,我才能再删除它

标签: php fopen unlink rm fclose


【解决方案1】:

我之前遇到过这个问题,并且能够通过在关闭文件和取消链接之前强制垃圾收集来解决:

gc_collect_cycles();

到目前为止,这不是最好的解决方案,但它确实解决了我删除之前打开和关闭行的文件的问题。

【讨论】:

  • 哇,好用,在fclose() 之后我找不到其他地方可以运行这个函数,但是它没有打嗝,谢谢你
  • 您认为清除缓存 (clearstatcache) 是否有助于解决此类溢出问题?
  • @BrianLeishman 请在fclose 之前尝试fflush,而不使用gc_collect_cycles hack?
  • 使用触摸创建的文件也会出现问题,同样的解决方案也适用。我曾经将文件作为互斥锁来触摸,以防止同一脚本在同时运行多次时重叠。我无法在脚本末尾取消链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
  • 2012-08-05
相关资源
最近更新 更多