Archivierung mit 7-Zip in PHP
Um Zip-Dateien zu packen und zu entpacken wird häufig die ZipArchive-Klasse in PHP genutzt, das ist einfach und unkompliziert, Beispiele dafür befindet sich im PHP Manual. Ein weiteres verbreitetes Komprimierungsformat ist RAR, doch PHP kann damit nativ nicht umgehen. Nehmen wir an wir bekommen RAR-Dateien hochgeladen und wollen sie entpacken. Wie machen wir das?
Wir benötigen also ein externes Programm, das mit RAR-Archiven umgehen kann, und ein weit verbreitetes Open-Source-Programm ist 7-Zip. 7-Zip beherrscht noch einige weitere Formate, unter anderem auch sein eigenes 7z-Format. Es ist teilweise besser als das kommerzielle WinZip. Hier die Haupt-Features von der Webseite:
- High compression ratio in 7z format with LZMA and LZMA2 compression
- Supported formats:
- Packing / unpacking: 7z, XZ, BZIP2, GZIP, TAR, ZIP and WIM
- Unpacking only: ARJ, CAB, CHM, CPIO, CramFS, DEB, DMG, FAT, HFS, ISO, LZH, LZMA, MBR, MSI, NSIS, NTFS, RAR, RPM, SquashFS, UDF, VHD, WIM, XAR and Z.
- For ZIP and GZIP formats, 7-Zip provides a compression ratio that is 2-10 % better than the ratio provided by PKZip and WinZip
- Strong AES-256 encryption in 7z and ZIP formats
- Self-extracting capability for 7z format
- Integration with Windows Shell
- Powerful File Manager
- Powerful command line version
- Plugin for FAR Manager
- Localizations for 79 languages
Es gibt also auch ein Kommandozeilentool, das wir aus PHP heraus nutzen können! Dann mal auf:
Zuerst laden wir uns 7-Zip herunter, entweder für Linux oder für Windows (7-Zip Command Line Version). Was wir benötigen ist die 7za Executable bzw. die 7za.exe
Dann muss die SevenZipArchive-Klasse heruntergeladen werden die ich auf GitHub erstellt habe. Diese kann dann direkt genutzt werden, hier beispielsweise zum Verifizieren, Packen und Entpacken einer TAR Datei unter Windows:
<?php require_once 'SevenZipArchive.php'; $sevenZipArchive = new SevenZipArchive(); $sevenZipArchive->setExecutablePath('C:/Program Files (x86)/7-Zip/7za.exe') ->setArchivePath('C:/Temp/test.tar'); if ($sevenZipArchive->verify()) { echo 'verification successful'; } else { echo 'verification failed'; }
<?php require_once 'SevenZipArchive.php'; $sevenZipArchive = new SevenZipArchive(); $sevenZipArchive->setExecutablePath('C:/Program Files (x86)/7-Zip/7za.exe') ->setArchivePath('C:/Temp/test.tar') ->setFilePath('C:/Temp/Angeln.gif'); if ($sevenZipArchive->compress()) { echo 'compression successful'; } else { echo 'compression failed'; }
<?php require_once 'SevenZipArchive.php'; $sevenZipArchive = new SevenZipArchive(); $sevenZipArchive->setExecutablePath('C:/Program Files (x86)/7-Zip/7za.exe') ->setArchivePath('C:/Temp/test.tar') ->setFilePath('C:/Temp/C'); if ($sevenZipArchive->decompress()) { echo 'decompression successful'; } else { echo 'decompression failed'; }
Die SevenZipArchive Klasse hat aktuell nur sehr grundsätzliche Fähigkeiten, man kann sie noch erweitern, zum Beispiel um die Fähigkeit, mehrere Dateien in ein Archiv zu packen. 7-Zip kann noch viel mehr, das könnte man alles noch einbauen. Wer möchte kann gern forken und mir Pull-Requests schicken, würd mich freuen!
Es gäbe auch die Möglichkeit eine 7-Zip PHP Extension zu erstellen, aktuell scheint es keine zu geben, aber der Bedarf ist da. Vielleicht findet sich ja jemand der sich da mal ranmachen möchte, einen Wrapper für 7za zu schreiben.
> Ein weiteres verbreitetes
> Komprimierungsformat ist RAR,
> doch PHP kann damit nativ
> nicht umgehen.
Wenns um das reine Lesen von RARs geht, dann unterstützt dies PHP mit einer Extension: http://php.net/manual/en/book.rar.php
Thomas
21 Sep 11 at 14:23
Ich hab evtl. ne Verwendung dafür. Danke!
Oliver
21 Sep 11 at 17:45
Über die Phar-Extension (PharData-Klasse) kann PHP auch direkt und nativ in zip und gzip Archiven rumfummeln.
KingCrunch
1 Okt 11 at 02:51
Kannte ich bereits aus meiner Microsoft – Batch zeit 😉
Stefan
3 Okt 11 at 18:51
Hallo Michael,
vielen Dank für die Klasse. Hat mir gerade eine Menge Tipparbeit erspart 🙂
Gruß, Kristian
Kristian
30 Mrz 12 at 18:50
Hallo,
ich habe die Klasse ein wenig erweitert. Da ich bisher nicht mit Git gearbeitet habe, kann ich die Klasse nicht hochladen. Gerne stelle ich sie aber zur Verfügung.
Folgende Ergänzungen habe ich durchgeführt:
1) Prüf-Funktion, ob shell_exec zur Verfügung steht und ob 7-Zip vorhanden ist. Diese Funktion ist wichtig, da ich nicht 100% sicher sein kann, dass 7-Zip auf dem Server installiert ist, auf dem das PHP-Projekt installiert wird. Diese Funktion ermöglicht einen Vorab-Test, damit im Fehlerfall eine Warnung/Hinweis ausgebeben werden kann.
2) Debug-Ausgabe: Wenn eine Funktion einen Fehler erzeugt, kann es in Debug-Umgebungen sinnvoll sein, zu erfahren, wie der Fehler lautet. (false ist ja bekanntlich etwas knapp). In einem False wird die Variable $this->_debug mit den Ausgabeinformationen von 7-Zip befüllt. Über eine entsprechende Get-Funktion kann der Fehler ausgelesen werden.
Ich würde mich über Rückmeldungen freuen und natürlich auch darüber, dass diese Klasse weiterentwickelt wird.
http://www.rgshops.de/sevenzip/SevenZipArchive_2012-04-04.zip
Robert
4 Apr 12 at 15:35
@Robert: Vielen Dank! Habe deine Änderungen unverändert in die Klasse übernommen und dich auch als Author hinzugefügt und auch einen Link zu dir gesetzt. OK so?
Wäre natürlich spitze wenn du dir Git (bzw. GitHub) etwas näher anschaust, dann kannst du auch an anderen interessanten Projekten sehr einfach mitarbeiten. GitHub hat da super Anleitungen wie man git einrichtet und dann eigene Projekte hochladen kann oder bestehende forken und weiterentwickeln kann. Erstell dir einfach einen kostenlosen Account und schau dann direkt auf der Hauptseite nach dem „GitHub Bootcamp“, da wird alles ausführlich erklärt.
Michael Kliewe
4 Apr 12 at 23:27
@Michael: Vielen Dank. Freue mich! Werde mir die Tage mal Git ansehen.
Robert
5 Apr 12 at 11:46