• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • zlib://

    bzip2://

    zip://

    压缩流

    说明

    compress.zlib://andcompress.bzip2://

    zlib:的功能类似gzopen(),但是其数据流还能被fread()和其他文件系统函数使用。自 PHP 4.3.0 后这个不建议被使用,因为会和其他带“:”字符的文件名混淆;请使用compress.zlib://作为替代。

    compress.zlib://compress.bzip2://和gzopen()、bzopen()是相等的。并且可以在不支持 fopencookie 的系统中使用。

    ZIP 扩展注册了zip:封装器。自 PHP 7.2.0 和 libzip 1.2.0+起,加密归档开始支持密码,允许数据流中使用密码。字节流上下文(stream contexts)中使用'password'选项设置密码。

    可选项

    • compress.zlib://file.gz
    • compress.bzip2://file.bz2
    • zip://archive.zip#dir/file.txt

    用法

    封装协议摘要
    属性支持
    受限于allow_url_fopenNo
    允许读取Yes
    允许写入Yes(除了zip://
    允许附加Yes(除了zip://
    允许同时读写No
    支持stat() No,请使用普通的file://封装器统计压缩文件。
    支持unlink() No,请使用file://封装器删除压缩文件。
    支持rename()No
    支持mkdir()No
    支持rmdir()No
    One-liners to gzip and ungzip a file:
    copy('file.txt', 'compress.zlib://' . 'file.txt.gz');
    copy('compress.zlib://' . 'file.txt.gz', 'file.txt');
    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.
    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);
    ?>
    
    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)
    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);
    }
    @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 :)

    上篇:php://

    下篇:data://