PHP无法在fclose之后取消链接文件

时间:2016-12-20 21:37:54

标签: php fopen unlink rm fclose

我的脚本完成后,我可以删除该文件,但在它运行时,即使在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:无法删除   '无敌-FILE.CSV&#39 ;:   文本文件繁忙

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

1 个答案:

答案 0 :(得分:5)

之前我遇到过这个问题,并且能够在关闭文件之后强制进行垃圾回收并在取消链接之前进行补救:

gc_collect_cycles();

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