Zip Compressed 파일을 조작하기 위해 PHP를 사용하는 경우 Zip_Read ()는 압축 패키지의 다음 파일 항목을 읽는 일반적인 기능입니다. 그러나 일부 개발자는 실제 작업에서 Zip_Read ()가 항상 False를 반환하여 다음 파일을 올바르게 읽지 못한다는 것을 발견했습니다. 이 문제는 여러 측면에서 나올 수 있습니다. 하나씩 분석 해 봅시다.
먼저, 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 ()가 리소스를 반환 한 후에 실행해야한다는 것입니다.
많은 개발자들은 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 () 호출 할 때는 현재 항목에 갇혀있을 수 있습니다. 파일 끝까지 읽거나 다음 항목으로 계속되기 전에 항목을 올바르게 닫으십시오.
문제가 zip 파일에있을 수도 있습니다. 일부 zip 파일은 정상적으로 열 수 있지만 일부 항목은 손상되거나 불규칙한 구조를 가질 수 있습니다. 예를 들어:
파일 이름에는 특수 문자가 포함되어 있습니다
입력 헤더 정보가 손상되었습니다
최신 압축 알고리즘이 사용되며 PHP의 zip 확장이 지원되지 않습니다.
Zip 파일의 무결성을보기 위해 Zipinfo 또는 기타 도구를 사용하는 것이 좋습니다. 명령 줄을 사용하여 테스트 할 수도 있습니다.
unzip -t archive.zip
이 명령에는 각 항목에 대한 테스트 결과가 나와 있습니다.
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는 오류 문제를 해결하기가 더 쉽고 암호 보호 지원, 스트리밍 감압, 파일 속성 읽기 등과 같은 더 풍부한 기능이 있습니다.
각 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 파일 처리 로직을보다 강력하게 만들 수 있습니다.