문제

PHP에서 Zip 파일을 만들기위한 클래스를 구축했습니다. 서버에서 허용되지 않는다고 가정 할 때 Ziparchive에 대한 대안. 해당 무료 서버와 함께 사용할 수있는 것.

이미 작동하고 PHP를 사용하여 Zip 구조를 구축하고 gzdeflate ()를 사용하여 압축 데이터를 생성합니다.

문제는, gzdeflate ()가 메모리에 전체 파일을로드해야한다는 것입니다. 클래스가 32MB의 메모리로 제한되는 작업을 원합니다. 현재 압축없이 16MB보다 큰 파일을 저장하고 있습니다.

16MB x 16MB 블록으로 데이터를 압축해야한다고 생각하지만 2 개의 gzdeflate ()의 결과를 연결하는 방법을 모르겠습니다.

나는 그것을 테스트하고 있었고 지난 16 비트의 수학이 필요한 것 같습니다. buff->last16bits = (buff->last16bits & newblock->first16bits) | 0xfffe, 그것은 작동하지만 모든 샘플에 대해서는 작동하지 않습니다 ...

질문 : 압축을 피우지 않고 두 개의 디플레이트 스트림을 연결하는 방법은 무엇입니까?

도움이 되었습니까?

해결책

PHP 스트림 필터는 이러한 작업을 수행하는 데 사용됩니다. stream_filter_append 스트림에서 읽거나 쓰는 동안 사용할 수 있습니다. 예를 들어

    $fp = fopen($path, 'r');
    stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_READ);

지금 fread 디플레이션 데이터를 반환합니다.

다른 팁

이것은 도움이되거나 도움이되지 않을 수 있습니다. gzwrite를 사용하면 메모리에 완전히로드하지 않고 파일을 쓸 수 있습니다. PHP 매뉴얼 페이지 의이 예는 GZWRITE 및 FOPEN을 사용하여 파일을 압축하는 방법을 보여줍니다.

http://us.php.net/manual/en/function.gzwrite.php

function gzcompressfile($source,$level=false){
    // $dest=$source.'.gz';
    $dest='php://stdout'; // This will stream the compressed data directly to the screen.
    $mode='wb'.$level;
    $error=false;
    if($fp_out=gzopen($dest,$mode)){
        if($fp_in=fopen($source,'rb')){
            while(!feof($fp_in))
                gzwrite($fp_out,fread($fp_in,1024*512));
            fclose($fp_in);
            }
          else $error=true;
        gzclose($fp_out);
        }
      else $error=true;
    if($error) return false;
      else return $dest;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top