PHP 는 rar 압축 풀기 확장 패키지 소결 읽 기 를 실현 합 니 다.

압축 해제 방면 의 확장 학습 으로서 두 개의 간판 압축 형식 rar 와 zip 는 컴퓨터 분야 의 압축 종결자 이다.rar 형식의 압축 패 키 지 는 Windows 시스템 에서 지배 적 인 위치 에 가 까 운 존재 입 니 다.오늘 우리 가 배 운 PHP 확장 은 rar 에 대한 압축 패 키 지 를 위 한 것 입 니 다.그러나 PHP 의 rar 확장 은 rar 형식의 압축 패 키 지 를 읽 고 풀 수 있 을 뿐 압축 작업 을 할 수 없습니다.
php-rar 확장 이 pecl 에 있 는 패 키 지 는 시간 이 지 났 습 니 다.PHP 7 에서 사용 할 수 없습니다.github 에 있 는 원본 코드 를 사용 하여 컴 파일 설치 해 야 PHP 7 환경 에서 설치 할 수 있 습 니 다.
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)
pp-rar 확장 은 두 가지 형식의 쓰기 가 있 습 니 다.하 나 는 대상 을 대상 으로 하 는 것 입 니 다.즉,RarArchive 류 를 사용 하여 압축 패 키 지 를 조작 하 는 것 입 니 다.다른 방식 은 함수 rar 를 직접 사용 하 는 것 입 니 다.open 은 rar 파일 의 핸들 을 가 져 오 는 데 사 용 됩 니 다.그것들 은 모두 다시 썼 다toString 방법 입 니 다.따라서 현재 핸들 이 작 동 하 는 구체 적 인 파일 을 직접 인쇄 할 수 있 습 니 다.
우리 가 핸들 을 닫 을 때,핸들 대상 은 여전히 출력 을 할 수 있 지만,뒤에 closed 가 표 시 됩 니 다.이 때 핸들 대상 은 이미 다른 조작 을 할 수 없습니다.

$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()방법 은 파일 이름 을 가 져 오 는 데 사 용 됩 니 다.이 파일 이름 은 경로 가 있 습 니 다.이 경 로 는 압축 패키지 의 절대 경로 입 니 다.getUnpacked Size()방법 은 파일 의 크기 를 가 져 오 는 데 사 용 됩 니 다.getStream()은 파일 흐름 을 가 져 오 는 데 사 용 됩 니 다.getStream()방법 을 통 해 출력 파일 의 내용 을 직접 인쇄 할 수 있 습 니 다.
물론 가장 중요 한 것 은 extract()방법 을 통 해 지정 한 디 렉 터 리 에 파일 을 직접 압축 해제 할 수 있 습 니 다.pp-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()방법 을 직접 사용 합 니 다.이 방법 을 통 해 RarEntry 대상 의 배열 을 얻 을 수 있 습 니 다.그 안에 포 함 된 것 은 이 rar 압축 가방 의 모든 내용 입 니 다.이 코드 에서 저 희 는 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
    //   }
}
Rar Exception::setUsingExceptions()를 true 로 설정 하면 phop-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
참고 문서:
https://www.php.net/manual/zh/book.rar.php
이상 은 PHP 의 rar 압축 해제 읽 기 확장 팩 학습 의 상세 한 내용 입 니 다.더 많은 PHP rar 압축 해제 읽 기 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기