Архивирование протоколов, логов при превышении размера
Готовая универсальная функция архивирования файлов протоколов, логов и прочих подобных. Позволяет перезаписывать файл архива или добавлять в него. При добавлении файл переименовывается добавлением к имени файла текущей даты, что обеспечивает уникальность имени внутри архива.
/** архивирует переданный файл в архив, если он превышает заданный размер
* @param string $file файл, подлежащий архивированию. Расширение обязательно должно присутствовать!
* @param boolean $add добавлять или перезаписывать архив
* @param int $MaxSize максимальный размер лога, который нужно упаковывать, по умолчанию 1Мб
*/
function ArchiveLog($file, $add=false, $MaxSize=1048576){
if(@filesize($file) < $MaxSize)return;
$coma=strrpos($file, '.');
$fileArxive=substr($file,0,$coma).'.zip';
// переименовываю, т.к. в него может идти запись из паралельного потока
$fileAdd=substr($file,0,$coma) .'_'. date("Y_m_d") . substr($file,$coma);
rename($file, $fileAdd);
$file=basename($add ? $fileAdd : $file );// в архиве должны быть уникальные имена файлов
$zip = new ZipArchive;
// CREATE - Создаем архив
// OVERWRITE - Перезаписываем
if($zip->open($fileArxive, ($add&&is_file($fileArxive)? ZIPARCHIVE::CHECKCONS : ZipArchive::OVERWRITE) ) === TRUE){
// первый параметр - откуда взять, второй как назвать внутри архива
$zip->addFile($fileAdd, $file);
$zip->close();
echo "<br>\nУпаковал ".$file." в ".$fileArxive;
unlink($fileAdd);
}else echo 'Ошибка создания архива '.$fileArxive;
}
// пример использования
ArchiveLog($_SERVER['DOCUMENT_ROOT'].'/log/protocol.log',true, 100);
.
Прокомментировать/Отблагодарить