2012-08-29 10 views
5

解決方法を探していますが、ログファイルを削除する必要がありますが、削除呼び出しが行われた時点でアクセスされている可能性があります。アクセスされることによって、私はプロセスがファイルを読み書きしていることを意味します。そのような場合、ファイルを削除せずにスキップする必要があります。また、私のサーバーはLinuxで、PHPはApacheで動作しています。現在アクセスされていない場合にファイルを削除する

私は何を探していますが(in pseudo-code)のようなものされています

<?php 
$path = "path_to_log_file"; 
$log_file = "app.log"; 
if(!being_accessed($log_file)) 
{ 
    unlink($path.$log_file); 
} 
?> 

今、私の質問は、私はbeing_accessedを定義する方法ですか?私は、PHPでこれに直接言語機能がないかもしれないことを知っています。私は

任意の提案/洞察力を歓迎します(?多分)last_access_timeのようなセクションの組み合わせを使用する方法について考えてflock(しかし、これは、ファイルがflockアクセスアプリケーションによって-edたこれらの条件に有用である)しています...

+0

「アクセス中」ファイルをどのように定義していますか? –

+0

プロセスを読むか、書くことがあるかもしれません。 –

+1

はLinux上で問題にはなりませんが、ファイルはすべてのファイルポインタが閉じられるまで実際には削除されません。 – SirDarius

答えて

6

一般的に、管理者権限を持たないと(つまり、lsofのようなツールを実行してあなたのファイルがリストされているかどうかを確認することはできませんが、スクリプトがlinux/unixサーバこれはほとんどのホストの場合)、ファイルシステムがこれを処理するので、気にする必要はありません。たとえば、1GBのファイルがあり、誰かがこのファイルをダウンロードしています。ファイルシステムはファイルがすでに開いている(いくつかのプロセスはハンドルを保持している)ので、それだけをマークするように、他の人のためにinvisibleと言うように(そのため、一度そのファイルを開いていて、ダウンロードを妨げません。あなたはそのファイルが見えなくなるフォルダの内容をリストしようとしますが、もしあなたのファイルが十分大きければ、利用可能なディスク容量を調べることができます。 dfと表示されていますが、まだ占有されていることを確認してください))、ハンドルをどのように保持していても、それを使用することができます。すべてのプロセスが終了すると、ハンドルファイルは物理的にメディアから削除され、ディスク領域は解放されます。必要に応じてリンクを解除するだけです。あなたがスローされることがありunlink警告について悩むならば、ちょうど

+0

そのような場合、削除はブロック呼び出しになるでしょうか?プロセスがループでそれに書き込んでいて、それに対するdelete呼び出しがあるかのように、書き込みプロセスが終了するまでdeleteブロックで終了しますか? –

+1

いいえ、誰もそのファイルを使用していないかのように、 'unlink'がすぐに返されます。 –

+0

私がやっていることに完璧なサウンド、ありがとう! –

1

あなたは、単にあなたのコードを変更したい、この呼び出しは、実行時に投げる可能性の警告を無効にする@マーク(@unlink())を使用してコールを付加(これは、Windows上の場合もあります)この方法(あなたが繰り返しそれをやっている場合):

<?php 
$path = "path_to_log_file"; 
$log_file = "app.log"; 
@unlink($path.$log_file); 

お知らせファイルは削除可能されていない場合にはエラーを避けるために、@、およびタグの終了タグの終了の欠如は、(一般的なエラーの源であるとすべき

関連する問題