현재 위치: > 최신 기사 목록> zip_read ()를 사용할 때 프로그램이 무한 루프로 떨어지지 않도록하는 방법은 무엇입니까?

zip_read ()를 사용할 때 프로그램이 무한 루프로 떨어지지 않도록하는 방법은 무엇입니까?

M66 2025-06-26

PHP에서 Zip 파일을 작동 할 때 일반적으로 사용되는 기능에는 Zip_open ()Zip_read ()가 포함됩니다. 이 두 기능은 조합으로 사용하여 zip 파일을 열고 항목을 하나씩 읽을 수 있습니다. 그러나 개발자는 종종 문제에 직면합니다. Zip_read ()를 호출하여 항목을 읽는 과정에서 프로그램은 무한 루프에 속할 수있어 과도한 리소스 사용을 초래하고 프로그램에 충돌 할 수 있습니다.

이 기사는 Zip_Read ()에서 무한 루프의 일반적인 원인을 설명하고 효과적인 예방 방법을 제공하는 데 중점을 둡니다.


1. Zip_Read () 무한 루프의 근본 원인

zip_read () 가 zip 파일에서 항목을 읽으면 내부 포인터를 통해 반복됩니다. ZIP 파일 자체가 손상되거나 종료 조건이 올바르게 호출되지 않으면 Zip_Read ()가 동일한 항목을 반복적으로 반환하여 죽은 루프가 발생합니다.

일반적인 이유는 다음과 같습니다.

  • ZIP 파일이 손상되었거나 비정상적인 형식이있어 항목 포인터가 올바르게 이동하지 않습니다.

  • 판단이없는 것과 같은 순환 조건 판단 오류는 ZIP 파일의 끝에 도달합니다.

  • 지퍼 리소스가 올바르게 닫히지 않거나 포인터가 이동하지 않습니다 .


2. Zip_Read () 의 데모 코드를 올바르게 사용하십시오

다음 예제는 zip_read ()를 안전하게 사용하여 ZIP 파일의 항목을 가로 지르고 무한 루프를 방지하는 방법을 보여줍니다.

 <?php
$zipFile = 'http://m66.net/sample.zip';

// 열려 있는 ZIP 문서
$zip = zip_open($zipFile);

if (!is_resource($zip)) {
    echo "无法열려 있는 ZIP 문서";
    exit;
}

while (($zipEntry = zip_read($zip)) !== false) {
    $entryName = zip_entry_name($zipEntry);
    
    // 처리 항목
    echo "读取문서条目:$entryName\n";
    
    // 열려 있는条目
    if (zip_entry_open($zip, $zipEntry)) {
        $contents = zip_entry_read($zipEntry, zip_entry_filesize($zipEntry));
        // 처리 내용,예를 들어 저장 또는 표시
        zip_entry_close($zipEntry);
    }

    // 알아채다:zip_read() 다음 항목으로 자동 이동합니다
}

// 폐쇄 ZIP 의지
zip_close($zip);
?>

핵심 사항 :

  • zip_read () 루프를 사용하는 경우, 유효하지 않은 항목이 읽지 않도록 조건이 ! == false인지 확인해야합니다.

  • 항목을 사용한 후에는 zip_entry_close () 에게 전화하여 현재 항목을 닫으려면 리소스 누출을 피해야합니다.

  • 루프가 완료되면 Zip_Close ()를 호출하여 zip 파일 자원을 닫으십시오.

  • zip 파일의 무결성과 올바른 형식을 확인하십시오.


3. 무한 루프를 피하기위한 실용적인 팁

  1. ZIP 파일이 유효한지 확인하십시오

    파일을 열기 전에 먼저 빈 파일을 열지 않거나 파일을 손상시키지 않도록 파일이 존재하고 합리적인 크기인지 확인할 수 있습니다.

  2. 사이클 수를 제한합니다

    불확실한 파일이 발생하면 최대 루프 수를 설정하여 데드 루프를 방지 할 수 있습니다. 예를 들어:

     $maxEntries = 1000;  // 최대 읽기 항목 수
    $count = 0;
    while (($zipEntry = zip_read($zip)) !== false && $count < $maxEntries) {
        // 처리 코드
        $count++;
    }
    if ($count >= $maxEntries) {
        echo "경고하다:최대 입력 제한에 도달합니다,可能存在异常문서。\n";
    }
    
  3. 다른 PHP 확장을 사용하여 교체하십시오

    PHP는 또한 지퍼 파일을 작동하기위한 ZipACHIVE 클래스를 가지고 있으며, 이는 더 강력하고 안전합니다. 불안정한 Zip_Read () 에 직면하면 Ziparchive를 사용하는 것이 좋습니다.


4. ZipAchive를 사용하여 Zip_Read () 예제를 대체합니다

 <?php
$zip = new ZipArchive();
$zipFile = 'http://m66.net/sample.zip';

if ($zip->open($zipFile) === true) {
    for ($i = 0; $i < $zip->numFiles; $i++) {
        $entryName = $zip->getNameIndex($i);
        echo "读取문서条目:$entryName\n";
        
        $stream = $zip->getStream($entryName);
        if ($stream) {
            $contents = stream_get_contents($stream);
            fclose($stream);
            // 처리 내용
        }
    }
    $zip->close();
} else {
    echo "无法열려 있는 ZIP 문서";
}
?>

Ziparchive는 처리 할 때 무한 루프 문제가 없으며 더 유연합니다.


5. 요약

  • zip_read ()를 사용하는 경우, 죽은 루프를 방지하기 위해 리턴 값이 False 인지 확인하십시오.

  • 각 항목 및 ZIP 파일 리소스가 올바르게 닫혀 있는지 확인하십시오.

  • 예외 파일이 무한 루프를 유발하지 않도록 루프 항목 수의 상한을 설정할 수 있습니다.

  • zip_read () 대신 더 현대적인 ziparchive 클래스를 사용하는 것이 좋습니다.

이러한 방법을 통해 Zip_Read ()를 사용할 때 PHP가 무한 루프로 떨어지는 문제를 효과적으로 피할 수있어 프로그램이 안정적이고 효율적으로 실행되도록합니다.