Когда-то давно делал так (с проверкой существования нужных файлов в архиве):
//передается путь к zip архиву
public function getData($filename) {
$zip = new \ZipArchive;
$res = $zip->open($filename);
if ($res === true) {
$msg = '';
$fail = false;
if (!$zip->getFromName('1.txt')) {
$fail = true;
$msg .= 'В архиве не найден файл 1.txt. ';
}
if (!$zip->getFromName('2.txt')) {
$fail = true;
$msg .= 'В архиве не найден файл 2.txt. ';
}
if (!$zip->getFromName('3.txt')) {
$fail = true;
$msg .= 'В архиве не найден файл 3.txt. ';
}
if (!$zip->getFromName('4.txt'))
{
$fail = true;
$msg .= 'В архиве не найден файл 4.txt. ';
}
if ($fail) {
return $ms;
}
$zip->extractTo(__DIR__.'/../../../../web/uploads/DBfiles/res');
$zip->close();
return 'Файлы успешно распакованы';
}
return 'Не удалось открыть архив';
}
И старые файлы успешно заменяются.