PHP에서 Zip 파일을 작동 할 때 일반적으로 사용되는 기능에는 Zip_open () 및 Zip_read ()가 포함됩니다. 이 두 기능은 조합으로 사용하여 zip 파일을 열고 항목을 하나씩 읽을 수 있습니다. 그러나 개발자는 종종 문제에 직면합니다. Zip_read ()를 호출하여 항목을 읽는 과정에서 프로그램은 무한 루프에 속할 수있어 과도한 리소스 사용을 초래하고 프로그램에 충돌 할 수 있습니다.
이 기사는 Zip_Read ()에서 무한 루프의 일반적인 원인을 설명하고 효과적인 예방 방법을 제공하는 데 중점을 둡니다.
zip_read () 가 zip 파일에서 항목을 읽으면 내부 포인터를 통해 반복됩니다. ZIP 파일 자체가 손상되거나 종료 조건이 올바르게 호출되지 않으면 Zip_Read ()가 동일한 항목을 반복적으로 반환하여 죽은 루프가 발생합니다.
일반적인 이유는 다음과 같습니다.
ZIP 파일이 손상되었거나 비정상적인 형식이있어 항목 포인터가 올바르게 이동하지 않습니다.
판단이없는 것과 같은 순환 조건 판단 오류는 ZIP 파일의 끝에 도달합니다.
지퍼 리소스가 올바르게 닫히지 않거나 포인터가 이동하지 않습니다 .
다음 예제는 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 파일의 무결성과 올바른 형식을 확인하십시오.
ZIP 파일이 유효한지 확인하십시오
파일을 열기 전에 먼저 빈 파일을 열지 않거나 파일을 손상시키지 않도록 파일이 존재하고 합리적인 크기인지 확인할 수 있습니다.
사이클 수를 제한합니다
불확실한 파일이 발생하면 최대 루프 수를 설정하여 데드 루프를 방지 할 수 있습니다. 예를 들어:
$maxEntries = 1000; // 최대 읽기 항목 수
$count = 0;
while (($zipEntry = zip_read($zip)) !== false && $count < $maxEntries) {
// 처리 코드
$count++;
}
if ($count >= $maxEntries) {
echo "경고하다:최대 입력 제한에 도달합니다,可能存在异常문서。\n";
}
다른 PHP 확장을 사용하여 교체하십시오
PHP는 또한 지퍼 파일을 작동하기위한 ZipACHIVE 클래스를 가지고 있으며, 이는 더 강력하고 안전합니다. 불안정한 Zip_Read () 에 직면하면 Ziparchive를 사용하는 것이 좋습니다.
<?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는 처리 할 때 무한 루프 문제가 없으며 더 유연합니다.
zip_read ()를 사용하는 경우, 죽은 루프를 방지하기 위해 리턴 값이 False 인지 확인하십시오.
각 항목 및 ZIP 파일 리소스가 올바르게 닫혀 있는지 확인하십시오.
예외 파일이 무한 루프를 유발하지 않도록 루프 항목 수의 상한을 설정할 수 있습니다.
zip_read () 대신 더 현대적인 ziparchive 클래스를 사용하는 것이 좋습니다.
이러한 방법을 통해 Zip_Read ()를 사용할 때 PHP가 무한 루프로 떨어지는 문제를 효과적으로 피할 수있어 프로그램이 안정적이고 효율적으로 실행되도록합니다.