zip 압축 패키지를 처리하기 위해 PHP의 Zip 확장을 사용하는 경우 Zip_Read () 및 Zip_entry_read () 는 종종 함께 사용되는 두 가지 기능입니다. 그러나 Zip_Read () 가있는 항목을 반복 할 때 많은 개발자가 혼란스러운 문제를 겪은 다음 Zip_entry_Read () 를 통해 내용을 읽으면 오류 가보고되며 빈 컨텐츠 또는 garbled 코드도 반환됩니다. 이것이 원인은 무엇입니까? 이 기사는 깊이있는 이유를 분석하고 솔루션을 제공합니다.
다음 코드를 고려하십시오.
$zip = zip_open('http://m66.net/test.zip');
if (is_resource($zip)) {
while ($entry = zip_read($zip)) {
echo '읽기 파일: ' . zip_entry_name($entry) . PHP_EOL;
if (zip_entry_open($zip, $entry)) {
$contents = zip_entry_read($entry);
echo $contents . PHP_EOL;
zip_entry_close($entry);
}
}
zip_close($zip);
}
위 코드를 실행하면 다음 오류가 발생할 수 있습니다.
Warning: zip_entry_read(): supplied resource is not a valid Zip Entry resource in...
또는 읽기 내용이 비어 있으므로 예상대로 완전히 충족되지 않습니다.
이 문제의 근본 원인은 일반적으로 다음 중 하나입니다.
zip_open ()은 파일 경로를 전달하는 것을 지원하지만 원격 URL을 반드시 지원하는 것은 아닙니다 . 위의 예에서 사용 된 http://m66.net/test.zip은 PHP가 allud_url_fopen을 활성화했는지 여부와 기본 zip 확장이 스트리밍 리소스에서 우편 데이터의 올바른 판독을 지원하는지 여부에 따라 다릅니다. 대부분의 경우 Zip_Open ()에는 직접 찾을 수있는 로컬 파일이 필요합니다.
zip_entry_read ()는 읽기 길이를 지정해야합니다. 길이가 지정되지 않으면 기본적으로 1024 바이트를 읽으므로 파일이 클 때 불완전한 컨텐츠가 발생합니다. 파일이 비어 있거나 잘못된 경우 직접 실패 할 수 있습니다.
zip_entry_open ()을 사용하여 항목을 열 때, 후속 zip_entry_read ()는 실패하면 실행되지 않습니다. 또한, 일부 버전의 PHP는 여러 항목간에 읽기를 전환 할 때, 특히 압축 방법이 저장되거나 디플레이트되지 않는 경우 호환성 문제가 있습니다.
지퍼 항목을 올바르게 읽으려면 다음 단계를 따라야합니다.
$localFile = 'test.zip';
copy('http://m66.net/test.zip', $localFile); // 로컬로 원격 파일을 다운로드하십시오
$zip = zip_open($localFile);
if (is_resource($zip)) {
while ($entry = zip_read($zip)) {
$name = zip_entry_name($entry);
echo "파일을 읽으십시오: $name" . PHP_EOL;
if (zip_entry_open($zip, $entry)) {
$size = zip_entry_filesize($entry);
$contents = zip_entry_read($entry, $size);
echo "콘텐츠: " . PHP_EOL . $contents . PHP_EOL;
zip_entry_close($entry);
} else {
echo "항목을 열 수 없습니다: $name" . PHP_EOL;
}
}
zip_close($zip);
}
몇 가지 핵심 사항은 다음과 같습니다.
먼저 원격 지퍼를 로컬 영역으로 다운로드 한 다음 zip_open ()을 사용하여 로컬 파일을여십시오.
zip_entry_filesize ()를 사용하여 올바른 읽기 길이를 얻으십시오.
항상 zip_entry_open () 이 true를 반환하는지 확인하십시오.
zip_read ()를 보고 오류를보고하는 주된 이유는 일반적으로 리소스 개방 방법, 읽기 길이가 올바르게 지정되지 않거나 원격 경로가 올바르게 처리되지 않습니다. 로컬 파일 경로를 항상 사용하고 zip_entry_filesize ()를 사용하여 콘텐츠를 정확하게 읽는 것이 좋습니다. 더 높은 요구가있는 경우보다 고급적이고 안정적인 인터페이스를 제공하는 Ziparchive 클래스 사용을 고려할 수도 있습니다.
올바른 프로세스를 통해 지퍼 파일을 읽는 것이 더 안전하고 안정적이며 효율적으로 만들어 질 수 있습니다.