현재 위치: > 최신 기사 목록> zip_read ()를 사용할 때 다음 파일 항목을 읽을 수없는 이유는 무엇입니까? 무엇이 잘못 되었습니까?

zip_read ()를 사용할 때 다음 파일 항목을 읽을 수없는 이유는 무엇입니까? 무엇이 잘못 되었습니까?

M66 2025-06-23

Zip Compressed 파일을 조작하기 위해 PHP를 사용하는 경우 Zip_Read ()는 압축 패키지의 다음 파일 항목을 읽는 일반적인 기능입니다. 그러나 일부 개발자는 실제 작업에서 Zip_Read ()가 항상 False를 반환하여 다음 파일을 올바르게 읽지 못한다는 것을 발견했습니다. 이 문제는 여러 측면에서 나올 수 있습니다. 하나씩 분석 해 봅시다.

1. 그것을 열 수있는 올바른 방법

먼저, zip 파일을 올바른 방법으로 열도록해야합니다. 표준 읽기 과정은 다음과 같습니다.

 $zip = zip_open("archive.zip");

if (is_resource($zip)) {
    while ($zip_entry = zip_read($zip)) {
        echo "Name: " . zip_entry_name($zip_entry) . "\n";
    }
    zip_close($zip);
}

여기서 핵심은 Zip_Read ($ Zip) 에 대한 호출이 Zip_open ()가 리소스를 반환 한 후에 실행해야한다는 것입니다.

2. zip_entry_open ()의 오류 사용

많은 개발자들은 Zip_Read () 후에 Zip_entry_open ()을 호출하여 현재 항목을 열고 읽은 후 PHP가 자동으로 커서를 처리하고 다음 파일로 이동한다고 잘못 생각합니다.

사실, 이것은 사실이 아닙니다. 매우 일반적인 실수는 다음과 같습니다.

 while ($entry = zip_read($zip)) {
    if (zip_entry_open($zip, $entry, "r")) {
        $data = zip_entry_read($entry);
        zip_entry_close($entry);
    }
}

데이터의 일부만 읽거나 읽기가 실패하면 다음에 zip_read () 호출 할 때는 현재 항목에 갇혀있을 수 있습니다. 파일 끝까지 읽거나 다음 항목으로 계속되기 전에 항목을 올바르게 닫으십시오.

3. zip 파일 자체의 문제

문제가 zip 파일에있을 수도 있습니다. 일부 zip 파일은 정상적으로 열 수 있지만 일부 항목은 손상되거나 불규칙한 구조를 가질 수 있습니다. 예를 들어:

  • 파일 이름에는 특수 문자가 포함되어 있습니다

  • 입력 헤더 정보가 손상되었습니다

  • 최신 압축 알고리즘이 사용되며 PHP의 zip 확장이 지원되지 않습니다.

Zip 파일의 무결성을보기 위해 Zipinfo 또는 기타 도구를 사용하는 것이 좋습니다. 명령 줄을 사용하여 테스트 할 수도 있습니다.

 unzip -t archive.zip

이 명령에는 각 항목에 대한 테스트 결과가 나와 있습니다.

4. 버전 호환성 문제

zip_read ()는 이전 zip 확장 (이전 버전의 libzip)에 속합니다. PHP 7.4 이상을 사용하는 경우 이전 ZIP API를 사용하지 않았을 수 있습니다. 대신 Ziparchive 클래스를 사용하는 것이 좋습니다.이 클래스는보다 안정적이고 현대적인 인터페이스를 제공합니다.

 $zip = new ZipArchive;
if ($zip->open('archive.zip') === TRUE) {
    for ($i = 0; $i < $zip->numFiles; $i++) {
        $entry = $zip->getNameIndex($i);
        echo "Entry: $entry\n";
    }
    $zip->close();
}

Zip_Read () 와 비교할 때 ZipAchive는 오류 문제를 해결하기가 더 쉽고 암호 보호 지원, 스트리밍 감압, 파일 속성 읽기 등과 같은 더 풍부한 기능이 있습니다.

5. 예 : 모든 파일을 읽고 지정된 도메인 이름 링크로 출력합니다.

각 zip 파일 항목을 출력하고 도메인 이름 (예 : M66.net )에 링크 된 경로를 생성하려면 다음을 수행 할 수 있습니다.

 $zip = zip_open("archive.zip");

if (is_resource($zip)) {
    while ($entry = zip_read($zip)) {
        $name = zip_entry_name($entry);
        echo "<a href='https://m66.net/files/" . urlencode($name) . "'>$name</a><br>";
    }
    zip_close($zip);
}

여기서 우리는 링크를 생성하고 실제로 파일을 추출하지 않습니다. https://m66.net/files/xxx 에 액세스하려면 실제로 지퍼의 내용을 서버의 해당 디렉토리로 압축해야합니다.

결론적으로

zip_read ()를 사용할 때 다음 파일 항목을 읽을 수없는 경우 :

  • 각 항목이 올바르게 읽히고 닫혀 있는지 확인하십시오.

  • ZIP 파일이 손상되지 않았거나 PHP에서 지원하지 않는 기능이 사용되지 않음을 확인하십시오.

  • 이전 Zip 함수를 Ziparchive 로 교체하십시오.

  • 코드 로직이 완료되었는지, 특히 루프를 처리 할 때 종료 조건에주의를 기울이십시오.

zip_read ()는 간단 해 보이지만 실제로 오류가 발생하기 쉽습니다. 그 기본 원리와 대안을 이해 함으로써만 갇히지 않고 ZIP 파일 처리 로직을보다 강력하게 만들 수 있습니다.