open($tempPath, ZipArchive::CREATE | ZipArchive::OVERWRITE); if ($openResult !== true) { throw new RuntimeException(sprintf('Failed to create bundle archive: %s', $filePath)); } $isOpen = true; foreach ($bundle->getMediaFiles() as $entryName => $contents) { self::addEntry($zip, basename($entryName), $contents, $filePath); } $proBytes = $bundle->getPresentation()->serializeToString(); self::addEntry($zip, $bundle->getProFilename(), $proBytes, $filePath); if (!$zip->close()) { throw new RuntimeException(sprintf('Failed to finalize bundle archive: %s', $filePath)); } $isOpen = false; self::moveTempFileToTarget($tempPath, $filePath); } finally { if ($isOpen) { $zip->close(); } if (is_file($tempPath)) { @unlink($tempPath); } } } private static function addEntry(ZipArchive $zip, string $entryName, string $contents, string $filePath): void { if (!$zip->addFromString($entryName, $contents)) { throw new RuntimeException(sprintf('Failed to add ZIP entry %s: %s', $entryName, $filePath)); } } private static function moveTempFileToTarget(string $tempPath, string $filePath): void { if (@rename($tempPath, $filePath)) { return; } if (@copy($tempPath, $filePath) && @unlink($tempPath)) { return; } throw new RuntimeException(sprintf('Unable to write bundle file: %s', $filePath)); } }