kiwilan/php-archive
Composer 安装命令:
composer require kiwilan/php-archive
包简介
PHP package to handle archives (.zip, .rar, .tar, .7z, .pdf) with unified API and hybrid solution (native/p7zip), designed to works with EPUB and CBA (.cbz, .cbr, .cb7, .cbt).
README 文档
README
PHP package to handle archives (.zip, .rar, .tar, .7z, .pdf) with unified API and hybrid solution (native/p7zip), designed to works with EPUB and CBA (.cbz, .cbr, .cb7, .cbt).
Supports Linux, macOS and Windows.
Warning
For some formats (.rar and .7z) rar PHP extension or p7zip binary could be necessary, see Requirements.
Requirements
- PHP version >= 8.1
- PHP extensions:
| Type | Supported | Requirement | Uses |
|---|---|---|---|
.zip, .epub, .cbz |
✅ | N/A | Uses zip extension |
.tar, .tar.gz, .cbt |
✅ | N/A | Uses phar extension* |
.rar, .cbr |
✅ | rar PHP extension or p7zip binary |
PHP rar or p7zip |
.7z, .cb7 |
✅ | p7zip binary |
p7zip binary |
.pdf |
✅ | Optional (for extraction) imagick PHP extension |
smalot/pdfparser |
*: for .tar archives with password, .7z will be used because extension don't support password.
Note
Here you can read some installation guides for dependencies
Warning
- On macOS, for
.rarextract, you have to installrarbinary to extract files,p7zipnot support.rarextraction. - On Windows, for
.pdfextract,imagickPHP extension have to work but my tests failed on this feature. So to extract PDF pages I advice to use WSL.
If you want more information, you can read section About.
Features
- List files as
ArchiveItemarray- With
getFileItems()method: list of files - With
getFileItem(string $path)method: file corresponding topathproperty - With
getFirst()method: first file - With
getLast()method: last file - With
find()method: find first file that match withpathproperty - With
filter()method: find all files that match withpathproperty
- With
- Content of file
- With
getContents()method: content of file as string (useful for images) - With
getText()method: content of text file (binaries files returnnull)
- With
- Extract files
- With
extract()method: extract files to directory - With
extractAll()method: extract all files to directory
- With
- Stat of archive corresponding to
stat - PDF metadata:
getTitle(),getAuthor(),getSubject(),getCreator(),getCreationDate(),getModDate(),getPages(), - Count files
- Create or edit archives, only with
.zipformat- With
make()method: create or edit archive - With
addFiles()method: add files to archive - With
addFromString()method: add string to archive - With
addDirectory()andaddDirectories()methods: add directories to archive - With
save()method: save archive
- With
Installation
You can install the package via composer:
composer require kiwilan/php-archive
Usage
Read and extract
With archive file (.zip, .rar, .tar, .7z, epub, cbz, cbr, cb7, cbt, tar.gz, .pdf).
$archive = Archive::read('path/to/archive.zip'); $files = $archive->getFileItems(); // ArchiveItem[] $count = $archive->getCount(); // int of files count $images = $archive->filter('jpeg'); // ArchiveItem[] with `jpeg` in their path $metadataXml = $archive->find('metadata.xml'); // First ArchiveItem with `metadata.xml` in their path $content = $archive->getContents($metadataXml); // `metadata.xml` file content $paths = $archive->extract('/path/to/directory', [$metadataXml]); // string[] of extracted files paths $paths = $archive->extractAll('/path/to/directory'); // string[] of extracted files paths
PDF files works with same API than archives but with some differences.
$archive = Archive::read('path/to/file.pdf'); $pdf = $archive->getPdf(); // Metadata of PDF $content = $archive->getContents($archive->getFirst()); // PDF page as image $text = $archive->getText($archive->getFirst()); // PDF page as text
Read from string
You can read archive from string with readFromString method.
$archive = Archive::readFromString($string);
This method will try to detect the format of the archive from the string. If you have an error, you can use readFromString method with third argument to specify the format of the archive.
$archive = Archive::readFromString($string, extension: 'zip');
Password protected
You can read password protected archives with read or readFromString method.
Warning
Works only with archives and not with PDF files.
$archive = Archive::read('path/to/password-protected-archive.zip', 'password');
Override binary path
For p7zip binary, you can override the path with overrideBinaryPath method.
$archive = Archive::read($path)->overrideBinaryPath('/opt/homebrew/bin/7z');
Stat
From stat PHP function: https://www.php.net/manual/en/function.stat.php
Gives information about a file
$archive = Archive::read('path/to/file.zip'); $stat = $archive->stat(); $stat->getPath(); // Path of file $stat->getDeviceNumber(); // Device number $stat->getInodeNumber(); // Inode number $stat->getInodeProtectionMode(); // Inode protection mode $stat->getNumberOfLinks(); // Number of links $stat->getUserId(); // User ID $stat->getGroupId(); // Group ID $stat->getDeviceType(); // Device type $stat->getSize(); // Size of file $stat->getLastAccessAt(); // Last access time $stat->getCreatedAt(); // Creation time $stat->getModifiedAt(); // Last modification time $stat->getBlockSize(); // Block size $stat->getNumberOfBlocks(); // Number of blocks $stat->getStatus(); // Status
Create
You can create archive with method Archive::make method.
Works only with .zip archives.
$archive = Archive::make('path/to/archive.zip'); $files = [ 'path/to/file/in/archive-file1.txt' => 'path/to/real-file1.txt', 'path/to/file/in/archive-file2.txt' => 'path/to/real-file2.txt', 'path/to/file/in/archive-file3.txt' => 'path/to/real-file3.txt', ]; foreach ($files as $pathInArchive => $pathToRealFile) { $archive->addFile($pathInArchive, $pathToRealFile); } $archive->addFromString('test.txt', 'Hello World!'); $archive->addDirectory('./directory', 'path/to/directory'); $archive->save();
Edit
You can edit archive with same method Archive::make method.
$archive = Archive::make('path/to/archive.zip'); $archive->addFromString('test.txt', 'Hello World!'); $archive->save();
Testing
composer test
About
This package was inspired by this excellent post on StackOverflow which make state of the art of PHP archive handling. The package Gemorroj/Archive7z was also a good source of inspiration cause it's the only package that handle .7z archives with wrapper of p7zip fork binary. But I would to handle all main archives formats with native PHP solution it possible, and use p7zip binary only if native solution is not available.
State of the art of PHP archive handling:
.zipwith ZipArchive.tarwith PharData.rarwith RarArchive ifrarextension is installed.7zcan't be handled with native PHP solution
| Type | Is native | Solution |
|---|---|---|
| ZIP | ✅ | Native |
| TAR | ✅ | Native |
| RAR | ❌ | rar or p7zip binary |
| 7ZIP | ❌ | p7zip binary |
| ❌ | smalot/pdfparser |
Why not full wrapper of p7zip binary?
This solution is used by Gemorroj/Archive7z, and it works well. But another problem is the usage of the p7zip fork which is not the official p7zip binary and can be difficult to install on some systems.
PHP can handle natively some archive formats, but not all. So I choose to use native PHP solution when it's possible, and use p7zip binary with official version when it's not possible.
Case of rar
The rar PHP extension is not installed by default on PHP, developers have to install it manually. This extension is not actively maintained and users could have some compilation problems. To install it with PHP 8.1 or 8.2, it's necessary to compile manually the extension, you could read this guide if you want to install it (for PHP 8.2, you will have a warning message but it's not a problem, the extension will work).
But rar PHP extension is a problem because it's not sure to have a compatibility with future PHP versions. So I choose to handle rar archives with p7zip binary if rar PHP extension is not installed.
Case of 7zip
PHP can't handle .7z archives natively, so I choose to use p7zip binary. You will have to install it on your system to use this package. You could read this guide if you want to install it.
Case of pdf
PHP can't handle .pdf archives natively, so I choose to use smalot/pdfparser package, embedded in this package. To extract pages as images, you have to install imagick extension you could read this guide if you want to install it.
eBooks and comics
This package can handle .epub, .cbz, .cbr, .cb7, .cbt archives, it's depends on the extension, check requirements section.
More
Alternatives:
- Gemorroj/Archive7z: handle many archives with p7zip-project/p7zip binary
- splitbrain/php-archive: native PHP solution to handle
.zipand.tararchives - maennchen/ZipStream-PHP: A fast and simple streaming zip file downloader for PHP. Using this library will save you from having to write the Zip to disk.
Documentation:
- List files in
.7z,.rarand.tararchives using PHP: https://stackoverflow.com/a/39163620/11008206 - Compression and Archive Extensions: https://www.php.net/manual/en/refs.compression.php
Changelog
Please see CHANGELOG for more information on what has changed recently.
Credits
- Ewilan Riviere
- All Contributors
- spatie for
spatie/package-skeleton-phpandspatie/temporary-directory smalot/pdfparserfor PDF parser7-zipforp7zipbinary
License
The MIT License (MIT). Please see License File for more information.
kiwilan/php-archive 适用场景与选型建议
kiwilan/php-archive 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 34.31k 次下载、GitHub Stars 达 10, 最近一次更新时间为 2023 年 03 月 24 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「php」 「pdf」 「ebook」 「zip」 「epub」 「archive」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 kiwilan/php-archive 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 kiwilan/php-archive 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 kiwilan/php-archive 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Book publishing application
PHP package to create OPDS feed for eBooks.
Reading and writing metadata included in the EPub ebook format
Creating EPUB and PDF ebook from Markdown
Provides TCPDF integration for Symfony
Alfabank REST API integration
统计信息
- 总下载量: 34.31k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 10
- 点击次数: 38
- 依赖项目数: 2
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2023-03-24
