PHP 5.6.22 is available

zlib://

bzip2://

zip://

zlib:// -- bzip2:// -- zip://圧縮ストリーム

説明

zlib: PHP 4.0.4 - PHP 4.2.3 (fopencookie をサポートするシステムのみ)

compress.zlib:// および compress.bzip2:// PHP 4.3.0以降

zlib:gzopen() と同様に 動作しますが、このストリームは fread() および 他のファイルシステム関数と組み合わせて使用することができるところが 異なります。この機能ではファイル名に ':' 文字が含まれる曖昧さが あるため、PHP 4.3.0 以降では古い機能となっています。代わりに compress.zlib:// を使用してください。

compress.zlib:// および compress.bzip2:// は、それぞれ gzopen() および bzopen() と等価で、 fopencookie をサポートしないシステムの上でも動作します。

ZIP 拡張モジュールzip: ラッパーを登録します。

利用法

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

オプション

ラッパーの概要
属性 サポートの有無
allow_url_fopen で制約される No
読み込み許可 Yes
書き込み許可 Yes (zip:// を除く)
追加許可 Yes (zip:// を除く)
同時読み書き許可 No
stat() のサポート No, 圧縮されたファイルの状態を知るには、通常の file:// ラッパーを使用します。
unlink() のサポート No, 圧縮されたファイルを unlink するには、通常の file:// ラッパーを使用します。
rename() のサポート No
mkdir() のサポート No
rmdir() のサポート No

add a note add a note

User Contributed Notes 4 notes

up
6
alvaro at demogracia dot com
5 years ago
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.
up
0
feodor at ctm dot ru
5 months ago
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);
?>
up
-2
joshualross at gmail dot com
8 years ago
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)
up
-5
eragonjml at googlemail dot com
2 years ago
@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 :)
To Top