PHP can't unlink file after fclose

3.2k views Asked by At

After my script finishes I can delete the file, but while it's running I can't touch it, even after an fclose(). Here is the code I'm trying to use:

    $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.");
    }
}

As you can see I'm trying to delete it through unlink() and using shell commands and neither are working, both give me this error:

rm: cannot remove 'invincible-file.csv': Text file busy

I also realize the script might be a bit overkill, but that's purely because I couldn't get it to work in any way, and some of the extra code is just for output purposes to try and debug what is happening.

1

There are 1 answers

4
Bryant Makes Programs On BEST ANSWER

I've run into this issue before and been able to remedy by forcing garbage collection after closing the file and before unlinking it:

gc_collect_cycles();

By far not the best solution, but it did resolve an issue I had deleting files that had been previously opened and closed lines before.