2016-12-20 10 views
8

スクリプトの終了後にファイルを削除できますが、実行中は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 '[email protected]:~$ ', $Command = "rm -f '$File' 2>&1", "\n", shell_exec($Command); 
     if (++$i > 5) 
      die("Could not delete the file."); 
    } 
} 

あなたは私がunlink()を通してそれを削除しようとシェルコマンドを使用して機能していないどちらもよ参照、両方の私は、このエラーを与えることができたよう:

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

私はスクリプトが少し残忍であるかもしれないが、純粋に私はそれが何らかの形で働くことができなかったので、余分なコードのいくつかは、起こっていることを試してデバッグするためのものです。

+4

'$ Files'の内容は何ですか?また、読み込みのために "r"モードで 'fopen'を使い、後でそのファイルを削除しようとしています。ユーザーが削除権限を持っていますか?たぶんそれは許可の問題です。他のコードなしで 'unlink'を実行してみてください。 –

+2

'unlink'の前に' @ 'を削除して、PHPがなぜ失敗したのかを伝えることができます。また、 'fclose'の戻り値を確認してください。 – chiliNUT

+0

@KodosJohnson今まで私を助けてくれてありがとう、私はあなたの 'unlink'を' fopen'なしで試してみるつもりです。例にさらにコードを追加しました。もっと重要な部分 –

答えて

5

私は前にこの問題に遭遇すると、ファイルを閉じた後、それをリンク解除する前に、ガベージコレクションを強制することにより解決することができました:

gc_collect_cycles(); 

遠くではない最善の解決策が、それは問題を解決しました前に開いて閉じていたファイルを削除しました。

+0

うわー、うまくいけば、 'fclose()'ちょっとしたこと、ありがとうございます。 –

+0

さらに、キャッシュをクリアすると( 'clearstatcache')、この種のオーバーランの問題が解決すると思いますか? – Martin

+0

@BrianLeishman 'gcl_collect_cycles'ハックなしで' fclose'の前に 'fflush'を試してみませんか? – bishop

関連する問題