This is the solution how to read stream from zip:
$fp = fopen('zip://foo.zip#bar.txt', 'r');
if( $fp ){
    while( !feof($fp) ){
        echo fread($fp, 8192);
    }
    fclose($fp);
}
    zlib:// -- bzip2:// -- zip:// — 压缩流
compress.zlib:// and compress.bzip2://
zlib: 的功能类似 gzopen(),但是 其数据流还能被 fread() 和其他文件系统函数使用。 不建议使用,因为会和其他带":"字符的文件名混淆; 请使用 compress.zlib:// 替代。
compress.zlib://、 compress.bzip2:// 和 gzopen()、bzopen() 是相等的。并且可以在不支持 fopencookie 的系统中使用。
   ZIP 扩展 注册了 zip: 封装器。 
    自 PHP 7.2.0 和 libzip 1.2.0+ 起,加密归档开始支持密码,允许数据流中使用密码。
    字节流上下文(stream contexts)中使用 'password' 选项设置密码。
  
This is the solution how to read stream from zip:
$fp = fopen('zip://foo.zip#bar.txt', 'r');
if( $fp ){
    while( !feof($fp) ){
        echo fread($fp, 8192);
    }
    fclose($fp);
}
    
One-liners to gzip and ungzip a file:
copy('file.txt', 'compress.zlib://' . 'file.txt.gz');
copy('compress.zlib://' . 'file.txt.gz', 'file.txt');
    
Prior to PHP 5.6 i used code like 
<?php
file_get_contents("compress.zlib://php://input");
?>
to read gz-compressed or plain input file. Not it doesn't work.
Simple workaround :
<?php
//file_get_contents("compress.zlib://php://input");
class gzip_header_filter8 extends php_user_filter {
    private $filtered = 0;
    public function filter($in, $out, &$consumed, $closing) {
        while ($bucket = stream_bucket_make_writeable($in)) {
            if($this->filtered == 0) {
                $header_len = 8;
                $header = substr($bucket->data, 0, 8);
                $flags = ord($header[1]);
                if($flags & 0x08) {
                    // a filename is present
                    $header_len = strpos($bucket->data, "\0", 8) + 1;
                }
                $bucket->data = substr($bucket->data, $header_len);
                $this->filtered = $header_len;
            }
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}
stream_filter_register('gzip_header_filter8', 'gzip_header_filter8');
$READ_LEN = 64*1024;
$MAX_BUF_LEN = $READ_LEN*1024;
$mode_plain=true;
$src=fopen("php://input","rb"); //test if OK!!!!
$magic_number=fread($src,2);
$input="";
    if(strlen($magic_number)==2)
        if(
            (ord($magic_number[0])==31)
        &&  (ord($magic_number[1])==139)
            )
        {
        $mode_plain=false;
        stream_filter_append($src, "gzip_header_filter8", STREAM_FILTER_READ);
        stream_filter_append($src, "zlib.inflate", STREAM_FILTER_READ);
        }
else
        {
        $input=$magic_number;
        }
/* read starts here*/
 $k = 0;
 while (!feof($src) && $k <= $MAX_BUF_LEN) {
      $inp = fread($src,$READ_LEN);
      $k += strlen($inp);
      $input.=$inp;
    }
echo $input;
fclose($src);
?>
    
@alvaro at demogracia dot com
well in fact that is wrong!
right code is:
<?php 
$fp = fopen('compress.zip://./foo.zip#bar.txt', 'r'); 
if( $fp ){ 
    while( !feof($fp) ){ 
        echo fread($fp, 8192); 
    } 
    fclose($fp); 
} 
?> 
as you might see you just have to add a "compress."
maybe when you posted this note is was right (2 years ago) but today its wrong... :/
sry for my english i am german :)
    
Example on how to read an entry from a ZIP archive (file "bar.txt" inside "./foo.zip"):
<?php
$fp = fopen('zip://./foo.zip#bar.txt', 'r');
if( $fp ){
    while( !feof($fp) ){
        echo fread($fp, 8192);
    }
    fclose($fp);
}
?>
Also, apparently, the "zip:" wrapper does not allow writing as of PHP/5.3.6. You can read http://php.net/ziparchive-getstream for further reference since the underlying code is probably the same.
    
I had a difficult time finding how to use compress.zlib with an http resource so I thought I would post what I found
<?php
$file = 'compress.zlib://http://www.example.com/myarchive.gz';
$fr = fopen($file, 'rb');
?>
Per the bugreport I found here (http://bugs.php.net/bug.php?id=29045)