private function streamFileData($stream, $compress, $level) { $dataLength = Count64::construct(0, !$this->zip64); $gzLength = Count64::construct(0, !$this->zip64); $hashCtx = hash_init('crc32b'); if (COMPR::DEFLATE === $compress) { $compStream = DeflateStream::create($level); } while (!feof($stream)) { $data = fread($stream, self::STREAM_CHUNK_SIZE); $dataLength->add(strlen($data)); hash_update($hashCtx, $data); if (COMPR::DEFLATE === $compress) { $data = $compStream->update($data); } $gzLength->add(strlen($data)); $this->write($data); $this->flush(); } if (COMPR::DEFLATE === $compress) { $data = $compStream->finish(); $gzLength->add(strlen($data)); $this->write($data); $this->flush(); } $crc = unpack('N', hash_final($hashCtx, true)); return array($dataLength, $gzLength, $crc[1]); }