Сократите файл в конце с помощью PHP

У меня есть файл журнала, который я бы хотел усечь после того, как он был прочитан PHP. В настоящее время мой код выглядит следующим образом:

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

Однако это обрезает файл, сохраняя первый 1Mb. Тем не менее, я хотел бы сохранить последний 1Mb файла; строки журналов добавляются, поэтому я хотел бы сохранить самые последние записи, а не самые старые (пост-усеченный файл всегда будет таким же с этим кодом).

Вы не можете использовать функцию 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); 

Попробуйте это, достаточно просто и делает трюк 🙂

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

edit: если запущена версия до версии v7.1 (в любом месте от php5), вы можете использовать

 $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 () является предпочтительным способом чтения содержимого файла в строку. Он будет использовать методы сопоставления памяти, если их поддерживает ваша ОС, для повышения производительности». Таким образом, чистый вызов отрицательного смещения остается лучшим способом получить последние N байтов файла.