У меня есть файл журнала, который я бы хотел усечь после того, как он был прочитан 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 байтов файла.