압축 및 압축 해제에 대한 확장 학습으로서 두 가지 ace 압축 형식인 rar 및 zip은 항상 컴퓨터 분야에서 압축의 종결자였습니다. rar 형식 압축 패키지는 Windows 시스템에서 거의 지배적입니다. 오늘 우리가 배우고 있는 PHP 확장은 rar 압축 패키지 작업을 위한 것입니다. 그러나 PHP의 rar 확장은 rar 형식 압축 패키지만 읽고 압축을 풀 수 있으며 압축 작업은 수행할 수 없습니다.
php-rar 확장의 pecl 설치 패키지는 오래되어 PHP7에서 사용할 수 없습니다. PHP7 환경에 성공적으로 설치하려면 github의 소스 코드를 사용하여 컴파일하고 설치해야 합니다.
https://github.com/cataphract/php-rar
직접 git clone을 한 후 일반 PHP 확장으로 설치하세요.
압축된 패키지 핸들 가져오기 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 확장에는 두 가지 형태의 쓰기가 있습니다. 하나는 객체 지향입니다. 즉, RarArchive 클래스를 사용하여 압축된 패키지를 작동하는 것입니다. 또 다른 방법은 rar_open 함수를 직접 사용하여 rar 파일의 핸들을 얻는 것입니다. 모두 __toString 메서드를 재정의하므로 핸들의 내용을 직접 인쇄하여 현재 핸들에서 작동하는 특정 파일을 볼 수 있습니다.
핸들을 닫으면 핸들 객체가 계속 출력될 수 있지만 나중에 닫힌 상태가 표시됩니다. 현재 핸들 개체는 더 이상 다른 작업을 수행할 수 없습니다.
$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;
RarArchive 개체의 일부 메서드는 현재 압축된 패키지의 정보를 얻는 데 도움이 될 수 있습니다. 예를 들어, getComment()는 압축된 패키지의 설명 정보를 가져오고, isBroken()은 현재 압축된 패키지가 손상되었는지 여부를 가져오고, isSolid()는 현재 압축된 패키지를 사용할 수 있는지 확인합니다. setAllowBroken() 메서드를 사용하면 손상된 압축 패키지에 대해 작업을 수행할 수 있습니다. 여기서는 객체 지향 및 프로세스 지향 작성 방법을 제공합니다.
압축 패키지의 각 엔터티 파일이나 디렉터리는 RarEntry를 작동합니다
압축 패키지의 핸들을 얻은 후에는 압축 패키지 내부의 내용을 추가로 얻어야 합니다. 핸들 개체는 이미 압축된 패키지 내부에 각 파일 및 디렉터리의 RarEntry 개체를 저장했습니다.
$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;
핸들 객체의 getEntry() 메서드는 지정된 파일이나 디렉터리의 내용을 가져오는 데 사용됩니다. 단일 파일이나 디렉터리를 가져오므로 가져올 파일의 내용을 명시적으로 지정해야 합니다. 이 방법을 통해 RarEntry 객체를 얻을 수 있습니다. 다음으로 이 개체에 대한 몇 가지 작업이 있습니다.
RarEntry 개체의 getName() 메서드는 파일 이름을 얻는 데 사용됩니다. 이 파일 이름에는 경로가 있으며 이 경로는 압축된 패키지 내의 절대 경로입니다. getUnpackedSize() 메소드는 파일의 크기를 가져오는 데 사용되며, getStream()은 파일 스트림을 가져오는 데 사용됩니다. getStream() 메소드를 통해 파일의 내용을 직접 인쇄할 수 있습니다.
물론, 가장 중요한 것은 extract() 메소드를 통해 지정된 디렉터리에 파일을 직접 추출할 수 있다는 것입니다. php-rar 확장자는 압축된 패키지 전체를 완전히 압축해제할 수 있는 방법을 제공하지 않으므로, 압축된 패키지 전체의 압축을 풀어야 한다면 압축된 패키지의 전체 내용을 반복하면서 이러한 파일들을 하나씩 압축해제해야 합니다. .
마지막으로 압축된 패키지의 모든 내용을 탐색하는 방법을 살펴보겠습니다.
$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; }
RarArchive 개체의 getEntries() 메서드를 직접 사용합니다. 이 메서드를 통해 rar 압축 패키지의 모든 내용이 포함된 RarEntry 개체의 배열을 얻을 수 있습니다. 이 코드에서는 RarEntry 개체의 다른 속성 메서드도 인쇄했습니다. 이름을 기반으로 이러한 메서드가 파일에 대한 다양한 정보를 얻는 데 사용된다는 것을 대략적으로 이해할 수 있습니다. 직접 테스트할 수 있습니다.
예외 처리
마지막으로 잘못된 파일을 열거나 압축 패키지에 포함되지 않은 파일을 가져온 경우 php-rar 확장 프로그램은 PHP 오류 형식으로 오류를 보고합니다. 그러나 완전한 객체 지향 작성 방법을 제공하므로 일련의 객체 지향 예외 처리 메커니즘도 제공해야 합니다.
// 不打开 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 // } }
RarException::setUsingExceptions()가 true로 설정되어 있는 한, php-rar 확장의 예외 처리 메커니즘이 활성화될 수 있습니다. 이때 잘못된 파일을 열거나 잘못된 파일 경로를 얻을 수 있습니다. 압축된 패키지를 사용하면 오류 메시지가 예외 형식으로 발생합니다.
요약
이 확장 프로그램 세트가 매우 사용자 친화적이라고 느껴지나요? 즉, 함수 운용에 초점을 맞춘 객체지향 접근방식과 프로세스 지향 접근방식을 제공합니다. 그러나 실제로 이렇게 하면 이점이 많지 않습니다. 이전 코드와 새로운 아이디어를 모두 고려해야 하고 확장 자체의 내부 구현이 훨씬 더 복잡해지기 때문입니다. 저희는 자체 코드를 작성할 때 이런 식으로 작성하지 않으려고 노력하고, 리팩토링 시에는 차근차근 최신 폼으로 마이그레이션만 합니다.
关于 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视频教程》