5

I am looking for a solution I need to delete log files, but there might be a possibility that they are being accessed at the moment the delete call is made. By being accessed, I mean a process is either reading or writing to the file. In such cases, I need to skip the file instead of deleting it. Also my server is Linux and PHP is running on Apache.

What I am looking for is something similar to (in pseudo-code):

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

Now my question is how can I define being_accessed? I know there might not be a language function do to this directly in PHP. I am thinking about using a combination of sections like last_access_time (maybe?) and flock (but this is useful only in those conditions where the file was flock-ed by the accessing application)

Any suggestions/insights welcome...

4

2 に答える 2

6

一般に、管理者権限がないとそれを見つけることはできません(つまりlsof、自分のファイルがリストされているかどうかを確認するようなツールを実行できます。ただし、スクリプトがlinux / unixサーバーで実行されている場合(これはほとんどのホスティング業者)ファイルシステムがこれを処理するので、気にする必要はありません。たとえば、1GBのファイルを取得し、誰かがこのファイルをダウンロードしています。ファイルを(unlink()または他の方法で)削除しても安全です。そのダウンローダーが起動したばかりで、ダウンロードを妨げない場合は、ファイルシステムはファイルがすでに開いていることを認識しているため(一部のプロセスはハンドルを保持している)、マークするだけです。invisible他の人のために(したがって、フォルダのコンテンツを一覧表示しようとすると、そのファイルは表示されなくなりますが、ファイルが十分に大きい場合は、使用可能なディスク容量を確認することができます(つまり、でdf、まだ占有されていることを確認できます))が、保持されたハンドルはまだそれを使用することができます。すべてのプロセスが閉じると、ハンドルファイルはメディアから物理的に削除され、ディスクスペースが解放されます。したがって、必要に応じてリンクを解除するだけです。警告unlinkがスローされる可能性がある場合(Windowsの場合)、呼び出しの前に@マーク(@unlink())を付けるだけで、実行時にこの呼び出しがスローする可能性のある警告を無効にできます。

于 2012-08-29T19:16:36.093 に答える
1

この方法でコードを変更するだけです(繰り返し行う場合):

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

ファイルが削除できない場合にエラーが発生しないように@に注意してください。また、終了タグがないことに注意してください(終了タグは一般的なエラーの原因であり、回避する必要があります)

于 2012-08-29T19:18:26.303 に答える