2017-12-15 4 views
3

PHPが読み込んだ後に切り捨てたいログファイルがあります。私のコードは、現在、次のようになります。PHPを最後にファイルを切り捨てます

$fp = fopen($file, "r+"); 
ftruncate($fp, 125000); 
fclose($fp); 

しかし、これは最初 1Mbのを保つことによって、ファイルを切り捨てます。しかし、の最後のファイルはです。ログ行が追加されるので、私は最も古いものよりも最新のエントリを保持したい(post-truncateファイルは常にこのコードと同じになる)。

+0

これは['ftruncate()'](http://php.net/manual/en/function.ftruncate.php)の機能です。ファイルの末尾を保持したい場合は、必要な部分を新しいファイルにコピーする独自のコードを記述する必要があります。次に、古いファイルを新しいファイルに置き換えます。 – axiac

+0

別のプロセスがログファイルを書き込み用に開いていて、「追加」モードを使用していない場合、それらは切り捨てられた位置に調整されません。ログファイルのローテーションは、通常、ファイルの名前を変更し、新しいファイルを開始するように信号をロガーに送信することによって行われます。 – Barmar

答えて

0

ftruncate関数を使用して、この処理を実行することはできません。これは、引数として最後の切り捨てサイズのみを受け入れ、切り詰めが最初から実行されるためです。これを試してみる:

// open the file for reading only 
$fp = fopen($file,'r'); 
// place the pointer at END - 125000 
fseek($fp,-125000,SEEK_END); 
// read data from (END - 125000) to END 
$data = fgets($fp,125000); 
// close the file handle 
fclose($fp); 

// overwrite the file content with data 
file_put_contents($file,$data); 
0

十分に簡単、これを試してみて、トリック:)

$logsToKeep = file_get_contents($file, NULL, NULL, -125000, 125000); 
file_put_contents($file,$logsToKeep); 

編集を行います。(どこでもPHP5から)前V7.1にバージョンを実行している場合、あなたは

を使用することができますが
$offset=filesize($file)-125000; 
if($offset>0){ 
    $logsToKeep = file_get_contents($file, NULL, NULL, $offset, 125000); 
    file_put_contents($file,$logsToKeep); 
} 

しかし、これは効率を低下させます。その答えは効率的である。 php docを引用すると、 "file_get_contents()はファイルの内容を文字列に読み込むための好ましい方法で、パフォーマンスを向上させるためにOSでサポートされていればメモリマッピングテクニックを使用します。したがって、負のオフセットへのクリーンな呼び出しは、ファイルの最後のNバイトを取得する最良の方法です。

+0

負のオフセットは、PHP 7.1.0まで使用できません。 – Barmar