Change Log
1.3.0 - Jul 29, 2025
BC change: Increased minimal PHP version to 7.1.0! (#47)
1.2.1 - Jun 27, 2025
- Fixed bugs in:
- AlchemyZippy::getLastModifiedDate (#44 by @rotdrop)
- LzwStreamWrapper (#46 by @cod3beat)
- Enhancements:
- Improved performance in one-file drivers extraction (gzip - #49, bzip - #50 by @iasjennen)
- Docs:
- Specified supported php versions: 5.5.0-8.3.x, deprecations in 8.4.x (#47 by @cedric-anne)
- Fixed support status for
xzin matrix: SevenZip does not support it (#45 by @rotdrop)
1.2.0 - Jun 30, 2023
- Deprecate few functions:
- Formats::checkFormatSupportAbility() marked deprecated, use
can()instead. - UnifiedArchive: addFile() and addDirectory() marked deprecated, use
add()instead.
- Formats::checkFormatSupportAbility() marked deprecated, use
- Changed behaviour:
- UnifiedArchive: add() and create() changed
fileOrFileshandling: if passed string, then file/directory will be archived with full its original name (as opposed to relative name before). - Formats: detectArchiveFormat() and getFormatMimeType() returns null instead of false in case of failed type detection.
- UnifiedArchive::getMimeType() returns null instead of false.
- UnifiedArchive: add() and create() changed
- New:
- Improved
test()functionality - returns list of mismatched hashes.
- Improved
1.1.10 - Jan 17, 2023
- Fixed invalid initialization of
TarByPeardriver (from 1.1.8)
1.1.9 - Jan 17, 2023
- Fixed archive type detection when filename is not lower-cased (#40)
1.1.8 - Nov 20, 2022
Fixed:
- Fixed opening an archive with password (#37)
- Fixed
UnifiedArchive->getComment()now returns null when comment is not supported by driver (#39) - Fixed
UnifiedArchive->getFileData()->modificationTimeis integer timestamp now in case of NelexaZip driver instead of DateTimeImmutable (#38) - Fixed
PharData::createfor zip-archives
Deprecations:
- Renamed methods of
UnifiedArchive:getFileNames=>getFilesextractFiles=>extractaddFiles=>adddeleteFiles=>deletearchiveFiles=>archivecanOpenArchive=>canOpen- Old methods are marked as deprecated and will be deleted in future releases.
- Marked as deprecated:
UnifiedArchive::detectArchiveType- useFormats::detectArchiveFormatinsteadUnifiedArchive::archiveDirectory/archiveFile- useUnifiedArchive::archiveinsteadUnifiedArchive::canCreateType-Formats::canCreate
New functions:
- Added method to get file extension for format:
Formats::getFormatExtension($archiveFormat) - Added method to get info about ready to archive files:
UnifiedArchive->prepareForArchiving($fileOrFiles, $archiveName = null) - Added method to create archive in memory:
UnifiedArchive::createInString()andBasicDriver::CREATE_IN_STRINGability constant - Added new pure driver for Zip/Tar(gz/bz2) - SplitbrainPhpArchive.
1.1.7 - Jul 31, 2022
opendoes not throw an Exception, it returns null- returned deleted methods in UnifiedArchive:
canOpenArchive,canOpenType,canCreateType,getArchiveType,detectArchiveType,getFileResource,getArchiveFormat,isFileExists,getArchiveSize,countCompressedFilesSize,countUncompressedFilesSize.
1.1.6 - Jul 31, 2022
BC-breaking changes:
- Changed signature:
UnifiedArchive::open($filename, string|null $password = null)=>UnifiedArchive::open($filename, array $abilities = [], string|null $password = null). Right now if second argument is string, it will be treated as password (for BC-compatability). openthrows an Exception when format is not recognized or there’s no driver that support requested abilities.addFiles/deleteFiles/getComment/setCommentthrows an Exception when driver does not support this ability.- Deleted methods in UnifiedArchive:
canOpenArchive,canOpenType,canCreateType,getArchiveType,detectArchiveType,getFileResource,getArchiveFormat,isFileExists,getArchiveSize,countCompressedFilesSize,countUncompressedFilesSize.
New features:
- Added passing needed abilities to UnifiedArchive::open() to select a better driver:
use wapmorgan\UnifiedArchive\Abilities;use wapmorgan\UnifiedArchive\Drivers\Basic\BasicDriver; # opens an array with driver, that supports content streaming and appending $archive = \wapmorgan\UnifiedArchive\UnifiedArchive::open('archive.7z', [Abilities::STREAM_CONTENT, Abilities::APPEND]); # if not specified, uses OPEN or OPEN_ENCRYPTED check, if password passed - Added
UnifiedArchive::test($files = [])(andcam files:testcommand) to test archive contents (compare actual control sum with stored crc32). - More informative output in commands:
system:drivers,system:formats,system:format, added commandfiles:test. - Added driver abilities to select better driver.
Driver changes:
- Added
NelexaZippure-PHP driver. - Added
Isodriver extraction ability. - Added commenting-ability for
SevenZipdriver (viadescript.ionfile in archive).
1.1.5 - Jun 28, 2022
New features:
- Reimplemented
cam(console utility) - now it’s on symfony/console and supports all features and more functions (folders, types) of UA. - Added more detailed installation instructions (
./vendor/bin/cam system:drivers) of specific drivers: AlchemyZippy, Cab, Iso, Lzma, Rar, SevenZip, TarByPear. - Added ability to track progress of archive creation - new argument
?callable $fileProgressCallableofUnifiedArchive::archiveFiles(). - Added ability to pass few directories to be placed in one in-archive directory in archiving/appending (
addFiles()/archiveFiles())[ '' => ['./folder1', './folder2'], 'README.md' => './subfolder/README.md' ] # Archive will have all folder1, folder2 contents in the root and README.md
Fixed:
- Fixed
extract()andlistContent()and their result of PclZip interface (UnifiedArchive::getPclZipInterface()) to correspond to original library (object => array). - Added tests on archiving, extraction and for PclZip-interface.
Format changes:
- Fixed counting of extracted files when extracting the whole archive in
TarByPear, TarByPhar, Zip. - Fixed calculation archive entry compressed size (approximately) and modification time, implemented entry content streaming in
TarByPhar.
1.1.4 - Dec 21, 2021
Disabled rar for SevenZip driver.
1.1.3 - May 2, 2021
Changed format of $files in archiveFiles() and addFiles()
[
'/var/www/log.txt', // will be "/var/www/log.txt"
'log2.txt' => '/var/www/log2.txt', // will be "/log2.txt"
'/var/www/site', // will be "/var/www/site"
'site2' => '/var/www/site2', // will be "/site2"
]
Old format also works, but there can be a bad case. If you have /var/www/log2.txt and log2.txt (in current directory) and pass following:
[
'/var/www/log2.txt' => 'log2.txt',
]
it will archive log2.txt as /var/www/log2.txt in an archive (new behaviour).
New features:
- Added
Formats::canStream()to check if an archive files can be streamed. - Added ability to create archives, encrypted with password (only zip (
Zip,SevenZip) and 7z (SevenZip)) - added nullable$passwordargument to:UnifiedArchive::archiveFiles($fileOrFiles, $archiveName, $compressionLevel = BasicDriver::COMPRESSION_AVERAGE, $password = null)UnifiedArchive::archiveFile($file, $archiveName, $compressionLevel = BasicDriver::COMPRESSION_AVERAGE, $password = null)UnifiedArchive::archiveDirectory($directory, $archiveName, $compressionLevel = BasicDriver::COMPRESSION_AVERAGE, $password = null)
- Added
UnifiedArchive->getMimeType()to get mime type of archive. - Added
UnifiedArchive->getComment()to get comment of an archive. Available only inZipandRardrivers, others returnnull. - Added
UnifiedArchive->setComment(?string $comment)to set comment. Available only inZip. - Added filter in
UnifiedArcihve->getFileNames(). If works asfnmatch()does. - Added ability to iterate over archive and access files data as array: ```php $a = \wapmorgan\UnifiedArchive\UnifiedArchive::open(‘tests/archives/fixtures.7z’); foreach ($a as $file => $data) { echo $file.PHP_EOL; }
$file_data = $a[‘filename’]; ```
Fixed:
- Fixed
SevenZipdriver: disabled tar.gz, tar.bzip2 support as it isn’t supported properly and described which formats driver can create, append, modify and encrypt.
Methods renamed (old exist, but marked as deprecated):
UnifiedArchive->getArchiveFormat->UnifiedArchive->getFormat.UnifiedArchive->getArchiveSize->UnifiedArchive->getSize.UnifiedArchive->countCompressedFilesSize->UnifiedArchive->getCompressedSize.UnifiedArchive->countUncompressedFilesSize->UnifiedArchive->getOriginalSize.UnifiedArchive->getFileResource->UnifiedArchive->getFileStream.UnifiedArchive->isFileExists->UnifiedArchive->hasFile.
1.1.2 - Mar 1, 2021
Fixed calculation of tar’s uncompressed size opened via TarByPear driver.
Fixed working with tar.xz archives.
1.1.1 - Feb 13, 2021
Cleaned package.
1.1.0 - Feb 13, 2021
New features:
- Added ability to open archives encrypted with password - added
$passwordargument toUnifiedArchive::open($fileName, $password = null). Works only with: zip, rar, 7z. - Added ability to adjust compression level for new archives - added
$compressionLevelargument (with defaultBasicDriver::COMPRESSION_AVERAGElevel) to:UnifiedArchive::archiveFiles($fileOrFiles, $archiveName, $compressionLevel = BasicDriver::COMPRESSION_AVERAGE)UnifiedArchive::archiveFile($file, $archiveName, $compressionLevel = BasicDriver::COMPRESSION_AVERAGE)UnifiedArchive::archiveDirectory($file, $archiveName, $compressionLevel = BasicDriver::COMPRESSION_AVERAGE)Works only with: zip, gzip.
- Added ability to append the archive with a file from string - added
addFileFromStringmethod:UnifiedArchive->addFileFromString(string $inArchiveName, string $content). - Added tests for format support:
Formats::canOpen()Formats::canCreate()Formats::canAppend()- check if file can be added to an archiveFormats::canUpdate()- check if archive member can be removedFormats::canEncrypt()- check if encrypted archive can be opened
Format changes:
- Extended SevenZip driver: now it supports a lot of formats (7z, zip, rar, iso, tar and so on).
- Added AlchemyZippy driver: it works via command-line programs for zip, tar, tar.gz and tar.bz2.
Methods renamed:
UnifiedArchive::canOpenType->Formats::canOpenUnifiedArchive::canOpenArchive->UnifiedArchive::canOpenUnifiedArchive::canCreateType->Formats::canCreateUnifiedArchive->getArchiveType->UnifiedArchive->getArchiveFormat- Old methods exist, but marked as deprecated.
1.0.1 - Nov 28, 2020
- Improved extendable for all classes - used late-static binding everywhere.
Format specific:
- gzip: improved detection of archive by content.
1.0.0 - Jun 13, 2020
Format specific:
- tar:
- Fixed automatic opening of .tar.Z and .tar.xz.
- rar:
- Exclude directories from files list.
0.2.0 - Feb 2, 2020
BC-breaking changes:
- Deleted deprecated UnifiedArchive methods:
extractNode,archiveNodes. - Functionality of preparing files list for archiving is moved from
archiveFiles()toprepareForArchiving(). - All mutable methods throws exceptions on errors now:
getFileData,getFileContent,getFileResourcethrowsNonExistentArchiveFileExceptionwhen file is not present in archive.extractFilesthrows:EmptyFileListExceptionArchiveExtractionException
deleteFiles,addFiles,addFileandaddDirectorythrows:EmptyFileListExceptionUnsupportedOperationExceptionArchiveModificationException
archiveFiles,archiveFileandarchiveDirectorythrows:FileAlreadyExistsExceptionEmptyFileListExceptionUnsupportedOperationExceptionArchiveCreationException
0.1.3 - Jan 13, 2020
BC-breaking changes:
- Minimal version is 5.5.0.
Format specific:
- zip: Fixed PclZip-interface
- 7zip: Fixed 7z-archiving, when archiving files should be renamed in archive
- lzw: Fixed check for availability (#15)
New features:
- Added
canCreateType(): bool - Added
canAddFiles(): bool - Added
canDeleteFiles(): bool
0.1.2 - Jan 03, 2019
BC-breaking changes:
- PclZip-interface getter renamed to
getPclZipInterface(). - Make
addFiles()return number of added files instead of total files number.
Other changes:
- Make
addFiles()/deleteFiles()/archiveFiles()throw\Exceptions when any error occurred (and even when files list is empty). - Fixed usage of
/always as directory separator inaddFiles()andarchiveFiles().
Format-specific changes:
- Divided format-specific code into separate components.
- zip:
- Excluded directories from files list (
getFileNames()). - Fixed retrieving new list of files after
addFiles()usage. - (#11) Fixed invalid “/” archive entry after
archiveFiles()usage.
- Excluded directories from files list (
- tar (
TarArchiveadapter):- Fixed number of added files of
addFiles(). - Fixed list of files after
deleteFiles()usage. - Added checks for compressed tar’s support in
canOpenArchive()andcanOpenType().
- Fixed number of added files of
- tar (
PharDataadapter):- Fixed list of files after
addFiles()/deleteFiles()usage and path generation of archive inarchiveFiles(). - Fixed path of files in
getFileNames()to use UNIX path separator (“/”).
- Fixed list of files after
- iso:
- Excluded directories from files list (
getFileNames()).
- Excluded directories from files list (
- 7zip:
- Fixed result of
deleteFiles()andarchiveFiles()in-archive paths. - Fixed calculation of compressed file size in
getFileData(). - (#10) Set infinite timeout of
7zsystem call (useful for big archives).
- Fixed result of
- cab:
- Fixed
extractFiles()functionality.
- Fixed
0.1.1 - Sep 21, 2018
API changes:
- Changed algorithm of files list generation in
archiveFiles()andaddFiles():// 1. one file $archive->archiveFiles('/var/www/site/abc.log', 'archive.zip'); // => stored as 'abc.log' // 2. directory $archive->archiveFiles('/var/www/site/runtime/logs', 'archive.zip'); // => directory content stored in archive root // 3. list $archive->archiveFiles([ '/var/www/site/abc.log' => 'abc.log', // stored as 'abc.log' '/var/www/site/abc.log', // stored as '/var/www/site/abc.log' '/var/www/site/runtime/logs' => 'logs', // directory content stored in 'logs' dir '/var/www/site/runtime/logs', // stored as '/var/www/site/runtime/logs' ], 'archive.zip'); -
Disabled paths expanding in
extractFiles()anddeleteFiles()by default.If you need to expand
src/path to all files within this directory in archive, set second argument$expandFilesListargument totrue.$archive->extractFiles(__DIR__, 'src/', true); $archive->deleteFiles('tests/', true); - Added new element in
archiveFiles()result in emulation mode. Now it returns an archive with 4 elements: newtypeelement with archive type.
Fixes:
- Fixed LZW-stream (.tar.Z) wrapper (before it didn’t work).
- Fixed ISO archives reading (before archive size could be calculated wrong).
- Fixed CAB archives extraction in
getFileContent($file)(before it didn’t work). - Improved extraction in
getFileContent($file)for RAR archives by using streams (before it did extract file in temporarily folder, read it and then delete it).
Improvements:
- Added
isFileExists($file): boolmethod for checking if archive has a file with specific name. - Added
getFileResource($file): resourcemethod for getting a file descriptor for reading all file content without full extraction in memory. - Added
canOpenArchive($archiveFileName): boolandcanOpenType($archiveFormat): boolstatic methods to check if specific archive or format can be opened. - Added
detectArchiveType($fileName): string|falsestatic method to detect (by filename or content) archive type. - Added
addFile($file, $inArchiveName = null)/addDirectory($directory, $inArchivePath = null)to add one file or one directory,archiveFile($file, $archiveName)/archiveDirectory($directory, $archiveName)to archive one file or directory.
Miscellaneous:
- Added simple tests.
- Added
phardistribution.
0.1.0 - Apr 11, 2018
API changes:
- Renamed methods
extractNode()→extractFiles(),archiveNodes()→archiveFiles(). Original method are still available with@deprecatedstatus. getFileData()now returnsArchiveEntryinstance instead ofstdClass. Original object fields are still available with@deprecatedstatus.addFiles()anddeleteFiles()now return false when archive is not editable.
Improvements:
- Added checks of archive opening status in constructor: now an
Exceptionwill be throwed if archive file is not readable. - Some changes in
archiveNodes()about handling directory names. - Fixed archive rescan in
addFiles()anddeleteFiles().
Miscellaneous:
- Removed example scripts (
examples/). - Code changes: added comments.
0.0.11 - Mar 21, 2018
- Cleaned up some old code.
- Added
ext-pharadapter for tar archives (ifpear/archive_taris not installed).
0.0.10 - Aug 7, 2017
- Remove
docoptfrom requirements. Now it’s a suggestion.
0.0.9 - Jul 20, 2017
- Added
cam(Console Archive Manager) script.
0.0.8 - Jan 24, 2017
- Added initial support for
CABarchives without extracting. - Added handling of short names of tar archives (.tgz/.tbz2/…).
- Removed external repository declaration.
- Removed
die()in source code.
0.0.7 - Jan 14, 2017
- Fixed usage of
eregfunction for PHP >7.
0.0.6 - Jan 9, 2017
- Added functionality for adding files in archive.
- Added functionality for deleting files from archive.
- Fixed discovering
7zarchive number of files and creating new archive.
0.0.5 - Jan 8, 2017
- Added support for
7z(by 7zip-cli) archives.
0.0.4 - Jan 7, 2017
- Added support for single-file
bz2(bzip2) andxz(lzma2) archives.
0.0.3 - Aug 18, 2015
- Removed
archive_tarfrom required packages.
0.0.2 - May 27, 2014
- Released under the MIT license
0.0.1 - May 26, 2014
First version.