Heim  >  Artikel  >  Backend-Entwicklung  >  Lassen Sie uns gemeinsam das rar-Dekomprimierungs- und Leseerweiterungspaket von PHP lernen!

Lassen Sie uns gemeinsam das rar-Dekomprimierungs- und Leseerweiterungspaket von PHP lernen!

藏色散人
藏色散人nach vorne
2021-06-24 15:36:273567Durchsuche

Lassen Sie uns gemeinsam das rar-Dekomprimierungs- und Leseerweiterungspaket von PHP lernen!

Lernen Sie mehr über das Leseerweiterungspaket rar decompression von PHP

Als erweitertes Lernprogramm zur Komprimierung und Dekomprimierung waren die beiden Spitzenkomprimierungsformate rar und zip schon immer die Auslöser der Komprimierung im Computerbereich. Das komprimierte Paket im RAR-Format ist in Windows-Systemen nahezu dominant. Die PHP-Erweiterung, die wir heute lernen, ist für Vorgänge mit komprimierten RAR-Paketen vorgesehen. Die RAR-Erweiterung von PHP kann jedoch nur komprimierte Pakete im RAR-Format lesen und dekomprimieren. Komprimierungsvorgänge können nicht ausgeführt werden.

Das pecl-Installationspaket der PHP-RAR-Erweiterung ist veraltet und kann nicht in PHP7 verwendet werden. Wir müssen den Quellcode auf Github verwenden, um es zu kompilieren und zu installieren, um es erfolgreich in der PHP7-Umgebung zu installieren.

https://github.com/cataphract/php-rar

Git direkt klonen und dann als normale PHP-Erweiterung installieren.

Holen Sie sich das komprimierte Paket-Handle RarArchive

$arch = RarArchive::open("test.rar");

$archNo = rar_open("test.rar");

echo $arch, PHP_EOL; // RAR Archive "/data/www/blog/test.rar"
echo $archNo, PHP_EOL; // RAR Archive "/data/www/blog/test.rar"

$arch->close();
rar_close($archNo);

echo $arch, PHP_EOL; // RAR Archive "/data/www/blog/test.rar" (closed)
echo $archNo, PHP_EOL; // RAR Archive "/data/www/blog/test.rar" (closed)

php-rar-Erweiterung hat zwei Formen des Schreibens: Eine ist objektorientiert, das heißt, sie verwendet die RarArchive-Klasse, um das komprimierte Paket zu betreiben. Eine andere Möglichkeit besteht darin, direkt eine Funktion rar_open zu verwenden, um das Handle einer rar-Datei abzurufen. Sie alle überschreiben die __toString-Methode, sodass wir den Inhalt des Handles direkt drucken können, um die spezifische Datei anzuzeigen, die vom aktuellen Handle betrieben wird.

Wenn wir das Handle schließen, kann das Handle-Objekt weiterhin ausgegeben werden, aber ein geschlossenes Objekt wird später angezeigt. Das Handle-Objekt kann zu diesem Zeitpunkt keine anderen Vorgänge mehr ausführen.

$arch = RarArchive::open("test.rar");
$archNo = rar_open("test.rar");

echo $arch->getComment(), PHP_EOL;
echo $arch->isBroken(), PHP_EOL;
echo $arch->isSolid(), PHP_EOL;

echo rar_comment_get($archNo), PHP_EOL;
echo rar_broken_is($archNo), PHP_EOL;
echo rar_solid_is($archNo), PHP_EOL;

echo $arch->setAllowBroken(true), PHP_EOL;
echo rar_allow_broken_set($archNo, true), PHP_EOL;

Einige Methoden des RarArchive-Objekts können uns helfen, die Informationen des aktuell komprimierten Pakets zu erhalten. Beispielsweise ruft getComment() die Beschreibungsinformationen des komprimierten Pakets ab, isBroken() ruft ab, ob das aktuell komprimierte Paket beschädigt ist, und isSolid() prüft, ob das aktuell komprimierte Paket verfügbar ist. Mit der Methode setAllowBroken() können wir beschädigte komprimierte Pakete bearbeiten. Hier vermitteln wir objektorientierte und prozessorientierte Schreibmethoden.

Jede Entitätsdatei oder jedes Verzeichnis im komprimierten Paket betreibt RarEntry

Nachdem wir das Handle des komprimierten Pakets erhalten haben, müssen wir den Inhalt im komprimierten Paket weiter abrufen. Das Handle-Objekt hat bereits die Objekte RarEntry jeder Datei und jedes Verzeichnisses im komprimierten Paket gespeichert.

$gameEntry = $arch->getEntry('ldxlcs/ldxlcs/game.htm');
echo $gameEntry->getName(), PHP_EOL; // ldxlcs/ldxlcs/game.htm
echo $gameEntry->getUnpackedSize(), PHP_EOL; // 56063

$gameEntryNo = rar_entry_get($arch, "ldxlcs/ldxlcs/game.htm");
echo $gameEntry->getName(), PHP_EOL; // ldxlcs/ldxlcs/game.htm
echo $gameEntry->getUnpackedSize(), PHP_EOL; // 56063

$fp = $gameEntryNo->getStream();
while (!feof($fp)) {
    $buff = fread($fp, 8192);
    if ($buff !== false) {
        echo $buff;
    } else {
        break;
    }
    //fread error
}
// 输出文件的全部内容
echo PHP_EOL;

echo 'Entry extract: ', $gameEntry->extract("./"), PHP_EOL;

Die getEntry()-Methode des Handle-Objekts wird verwendet, um den Inhalt der angegebenen Datei oder des angegebenen Verzeichnisses abzurufen. Es wird eine einzelne Datei oder ein einzelnes Verzeichnis abgerufen, daher muss der Inhalt der abzurufenden Datei explizit angegeben werden. Mit dieser Methode können wir ein RarEntry-Objekt erhalten. Als nächstes gibt es einige Operationen für dieses Objekt.

Die Methode getName() des RarEntry-Objekts wird verwendet, um den Dateinamen zu erhalten. Dieser Dateiname hat einen Pfad, und dieser Pfad ist der absolute Pfad innerhalb des komprimierten Pakets. Die Methode getUnpackedSize() wird verwendet, um die Größe der Datei abzurufen, und getStream() wird verwendet, um den Dateistream abzurufen. Über die Methode getStream() können wir den Inhalt der Datei direkt drucken.

Das Wichtigste ist natürlich, dass wir eine Datei über die Methode extract() direkt in das angegebene Verzeichnis extrahieren können. Die Erweiterung php-rar bietet keine Methode, mit der das gesamte komprimierte Paket vollständig dekomprimiert werden kann. Wenn wir also das gesamte komprimierte Paket dekomprimieren müssen, müssen wir diese Dateien einzeln dekomprimieren, indem wir den gesamten Inhalt des komprimierten Pakets durchlaufen. .

Schließlich sehen wir uns an, wie der gesamte Inhalt des komprimierten Pakets durchlaufen wird.

$entries = $arch->getEntries();

foreach ($entries as $en) {
    echo $en, PHP_EOL;
    echo $en->getName(), PHP_EOL;
    echo $en->getUnpackedSize(), PHP_EOL;
    echo $en->getAttr(), PHP_EOL;
    echo $en->getCrc(), PHP_EOL;
    echo $en->getFileTime(), PHP_EOL;
    echo $en->getHostOs(), PHP_EOL;
    echo $en->getMethod(), PHP_EOL;
    echo $en->getPackedSize(), PHP_EOL;
    echo $en->getVersion(), PHP_EOL;
    echo $en->isDirectory(), PHP_EOL;
    echo $en->isEncrypted(), PHP_EOL;

}

// 压缩包中所有文件的内容
// RarEntry for file "ldxlcs/ldxlcs/game.htm" (3c19abf6)
// ldxlcs/ldxlcs/game.htm
// 56063
// 32
// 3c19abf6
// 2017-09-10 13:25:04
// 2
// 51
// 7049
// 200
// ……

$entriesNo = rar_list($archNo);
foreach ($entriesNo as $en) {
    echo $en->getName(), PHP_EOL;
}

Verwendet direkt die Methode getEntries() des RarArchive-Objekts. Über diese Methode können wir ein Array von RarEntry-Objekten erhalten, das den gesamten Inhalt des rar-komprimierten Pakets enthält. In diesem Code haben wir auch einige andere Attributmethoden des RarEntry-Objekts gedruckt. Anhand der Namen können Sie grob verstehen, dass diese Methoden verwendet werden, um verschiedene Informationen über die Datei zu erhalten.

Ausnahmebehandlung

Wenn Sie schließlich die falsche Datei öffnen oder eine Datei erhalten, die nicht im komprimierten Paket enthalten ist, meldet die Erweiterung php-rar einen Fehler in Form eines PHP-Fehlers. Da es jedoch eine vollständige objektorientierte Schreibmethode bietet, muss es auch eine Reihe objektorientierter Ausnahmebehandlungsmechanismen bereitstellen.

// 不打开 UsingExceptions 全部错误会走 PHP 错误机制,打开后走 PHP 的异常机制
RarException::setUsingExceptions(true);
var_dump(RarException::isUsingExceptions()); // bool(true)
try {
    $arch = RarArchive::open("test1.rar");
    $arch->getEntry('ttt.txt');
} catch (RarException $e) {
    var_dump($e);
    // object(RarException)#35 (7) {
    //     ["message":protected]=>
    //     string(91) "unRAR internal error: Failed to open /data/www/blog/test1.rar: ERAR_EOPEN (file open error)"
    //     ["string":"Exception":private]=>
    //     string(0) ""
    //     ["code":protected]=>
    //     int(15)
    //     ["file":protected]=>
    //     string(22) "/data/www/blog/rar.php"
    //     ["line":protected]=>
    //     int(93)
    //     ["trace":"Exception":private]=>
    //     array(1) {
    //       [0]=>
    //       array(6) {
    //         ["file"]=>
    //         string(22) "/data/www/blog/rar.php"
    //         ["line"]=>
    //         int(93)
    //         ["function"]=>
    //         string(4) "open"
    //         ["class"]=>
    //         string(10) "RarArchive"
    //         ["type"]=>
    //         string(2) "::"
    //         ["args"]=>
    //         array(1) {
    //           [0]=>
    //           string(9) "test1.rar"
    //         }
    //       }
    //     }
    //     ["previous":"Exception":private]=>
    //     NULL
    //   }
}

Solange RarException::setUsingExceptions() auf true gesetzt ist, kann der Ausnahmebehandlungsmechanismus der PHP-RAR-Erweiterung aktiviert werden. Zu diesem Zeitpunkt öffnen wir eine falsche Datei oder erhalten einen falschen Dateipfad in komprimiertes Paket, dann wird die Fehlermeldung in Form einer Ausnahme ausgegeben.

Zusammenfassung

Fühlen sich diese Erweiterungen sehr benutzerfreundlich an? Das heißt, es bietet einen objektorientierten Ansatz und einen prozessorientierten Ansatz, der sich auf Funktionsoperationen konzentriert. Tatsächlich bietet dies jedoch nicht viele Vorteile, da sowohl alter Code als auch neue Ideen berücksichtigt werden müssen und die interne Implementierung der Erweiterung selbst viel komplizierter wird. Wir versuchen, nicht so zu schreiben, wenn wir unseren eigenen Code schreiben, sondern migrieren beim Refactoring einfach Schritt für Schritt auf die neueste Form.

关于 rar 的压缩操作并没有找到太多有用的资料。当然,我们在生产环境中如果要生成压缩包的话大部分情况下都会直接去生成 zip 格式的提供给用户,毕竟大部分的客户端软件都是能够同时支持 rar 和 zip 格式文件的解压的,如果一定要指定生成 rar 的话,也可以多多和产品经理或者客户商量。有的时候,技术的难点是可以通过业务的变通来解决的,最重要的其实还是在于沟通。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/PHP%E7%9A%84rar%E8%A7%A3%E5%8E%8B%E8%AF%BB%E5%8F%96%E6%89%A9%E5%B1%95%E5%8C%85%E5%AD%A6%E4%B9%A0.php

推荐:《PHP视频教程

Das obige ist der detaillierte Inhalt vonLassen Sie uns gemeinsam das rar-Dekomprimierungs- und Leseerweiterungspaket von PHP lernen!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen