사용자가 웹 양식을 통해 zip 파일을 업로드 할 수있게해야합니다. 서버가 Apache 웹 서버로 Linux를 실행 중입니다. Archive::Zip과 같은 모듈을 사용하면이 아카이브를 추출 할 때 이점이 있습니까? 아니면 역 추적을 사용하여 unzip
에 대한 시스템 호출 만 실행해야합니까?어떻게 펄에서 압축 된 압축 파일을 추출 할 수 있습니까?
답변
당신은 바이너리 unzip
을 실행하면 프로세스가/간부 및
- 합니다 (생성 된 프로세스의 기간 동안)
- 소비하는 새로운 프로세스 더 많은 메모리를 인스턴스화
당신 포크 것 unzip
의 올바른 경로로 구성해야합니다. 이 모든 것을 감안할 때, 나는 도서관 접근법을 강력히 선호 할 것이다.
Archive::Zip documentation에 따르면 당신은 Archive::Extract를 사용하여 더 나을 것 :
당신은 당신이 아카이브를 사용하여 보는 것이 좋습니다 추출 지퍼 (및/또는 기타 아카이브)로가는 경우 : 추출 그 대신 아카이브 별 기능을 사용하고 제거하는 것이 훨씬 쉬워지기 때문입니다.
재미 있기 때문에 Archive::Extract will try Archive::Zip first and then fall back to the unzip
binary if it fails. 그것은 Archive :: Zip이 선호되는 옵션입니다.
Archive :: Zip은 zlib 시스템 라이브러리의 하위 인터페이스 인 Compress::Raw::Zlib을 사용합니다. 그래서 순수한 Perl 구현이 아니기 때문에 성능면에서 비슷할 것입니다. unzip
. 즉, 성능 관점에서 볼 때 Archive :: Zip보다 앞서 unzip
을 선택할 이유가 없습니다.
'Archive :: Extract'를 사용하면 다른 압축 형식에서도 작동합니다. –
하나의 관심사는 메모리입니다. Archive::Tar
에 메모리 누수가있는 어려운 방법 (프로덕션 웹 서버가 손상됨)을 발견했습니다. 따라서 전체적으로 외부 명령에 대한 시스템 호출 대신 모듈을 사용하는 것이 좋은 생각이지만 (추론을위한 다른 응답 참조), 모듈에 문제가 없는지 확인해야합니다.
나는 이런 생각을 결코 이해하지 못합니다. fork/exec는 매우 빠른 프로세스이므로, 쉘 스크립트를 읽거나 쓰는 데 시간을 허비하는 사람은 누구나이 사실을 알고 있습니다. unzip 바이너리 자체가 소비하는 메모리는 알고리즘의 비용 및 (특히) 그 안에있는 데이터와 비교하면 사소합니다. 그리고/usr/bin/unzip은 기본적으로 모든 리눅스 배포본에 포함되어 있습니다. BSD와 Cygwin도 믿습니다. 예제 코드가'open $ input, "unzip -cp $ ARCHIVE $ FILE |"'이 아니라면 간단한 옵션을 강하게 선호합니다. –
위의 * 일반적으로 *에 동의하지만,로드가 많은 서버가 있으면 fork/exec 모델로 자원 소비가 증가합니다. PID 할당, 프로세스 간 스트림 할당, 메모리 할당 (COPY시 허용). 독립 실행 형 프로세스의 경우 fork/exec 모델에 만족합니다. 서버 모델의 경우 자원 배분량이 가장 적은 모델을 선호합니다. –
루프, 특히 핫 루프에서 분기하는 경우 성능 문제가 절대적으로 발생합니다. 루프가 없거나 1 초에 한 번 또는 몇 초에 한 번씩 포크를 실행하는 경우 아무런 문제가 없습니다. 또한, 시스템'unzip' 대신에 라이브러리를 사용하는 것이 이점이 될 수 있습니다; 라이브러리는 더 새롭고 버그가 적을 수 있습니다. –