PHP可以';在fclose之后,请不要取消文件链接

PHP可以';在fclose之后,请不要取消文件链接,php,fopen,unlink,rm,fclose,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))

脚本完成后,我可以删除文件,但在文件运行时,即使在执行
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:无法删除 “invincible file.csv”: 文本文件忙


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

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

gc_collect_cycles();

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

$files
的内容是什么?此外,您还可以在“r”模式下使用
fopen
进行读取,并在稍后尝试删除该文件。您确定用户有删除权限吗?也许这是许可问题。尝试在不使用任何其他代码的情况下执行
取消链接
。在
取消链接
之前删除
@
,以便让php告诉您失败的原因。另外,检查
fclose
@KodosJohnson的返回值感谢您迄今为止的帮助,我将尝试在根本不使用
fopen
的情况下取消链接
,并且我在示例中添加了更多的代码,希望我没有遗漏任何更重要的代码parts@chiliNUT我已经做过了,我得到的xdebug输出给出了相同的结果error@KodosJohnson如果我删除
fopen
等,它将删除所有文件,而不会出现任何问题。只有当我用PHP脚本打开和关闭文件时,我才能再删除它。哇,我在哪里都找不到这个函数可以在
fclose()
之后运行,但是没有任何问题,谢谢你。你认为除此之外,清除缓存(
clearstatcache
)是否有助于解决这种溢出问题?@BrianLeishman请在
fclose
之前尝试
fflush
,而不使用
gc\u collect\u cycles
hack?使用touch创建的文件也会出现此问题,同样的解决方案也适用于它。我曾经将一个文件作为互斥对象来处理,以防止同一脚本在同时运行多次时重叠。我无法在脚本末尾取消链接。