• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • gzwrite()

    (PHP 4, PHP 5, PHP 7)

    Binary-safe gz-file write

    说明

    gzwrite(resource $zp,string $string[,int $length]): int

    gzwrite() writes the contents of$stringto the given gz-file.

    参数

    $zp

    The gz-file pointer. It must be valid, and must point to a file successfully opened by gzopen().

    $string

    The string to write.

    $length

    The number of uncompressed bytes to write. If supplied, writing will stop after$length(uncompressed)bytes have been written or the end of$stringis reached, whichever comes first.

    Note:

    Note that if the$lengthargument is given, then the magic_quotes_runtime configuration option will be ignored and no slashes will be stripped from$string.

    返回值

    Returns the number of(uncompressed)bytes written to the given gz-file stream.

    范例

    gzwrite() example

    <?php
    $string = 'Some information to compress';
    $gz = gzopen('somefile.gz','w9');
    gzwrite($gz, $string);
    gzclose($gz);
    ?>
    

    参见

    This is a short example of use gzwrite function. 
    <?php
    function gzcompressfile($source,$level=false){
      $dest=$source.'.gz';
      $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;
      }
    ?>
    the function gzcompressfile() compress a file 'data.csv' to 'data.csv.gz'. the function return false if error, and the new file name if it's ok.
    gz compression is often used with tar archives. Building tar archives is quite easy. Here is a code snipplet which can be used for building tar archives before compressing them to tar.gz.
    <?php
    //\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
    // Adds file header to the tar file, it is used before adding file content.
    // f: file resource (provided by eg. fopen)
    // phisfn: path to file
    // archfn: path to file in archive, directory names must be followed by '/'
    //\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
    function TarAddHeader($f,$phisfn,$archfn)
    {
      $info=stat($phisfn);
      $ouid=sprintf("%6s ", decoct($info[4]));
      $ogid=sprintf("%6s ", decoct($info[5]));
      $omode=sprintf("%6s ", decoct(fileperms($phisfn)));
      $omtime=sprintf("%11s", decoct(filemtime($phisfn)));
      if (@is_dir($phisfn))
      {
         $type="5";
         $osize=sprintf("%11s ", decoct(0));
      }
      else
      {
         $type='';
         $osize=sprintf("%11s ", decoct(filesize($phisfn)));
         clearstatcache();
      }
      $dmajor = '';
      $dminor = '';
      $gname = '';
      $linkname = '';
      $magic = '';
      $prefix = '';
      $uname = '';
      $version = '';
      $chunkbeforeCS=pack("a100a8a8a8a12A12",$archfn, $omode, $ouid, $ogid, $osize, $omtime);
      $chunkafterCS=pack("a1a100a6a2a32a32a8a8a155a12", $type, $linkname, $magic, $version, $uname, $gname, $dmajor, $dminor ,$prefix,'');
      $checksum = 0;
      for ($i=0; $i<148; $i++) $checksum+=ord(substr($chunkbeforeCS,$i,1));
      for ($i=148; $i<156; $i++) $checksum+=ord(' ');
      for ($i=156, $j=0; $i<512; $i++, $j++)  $checksum+=ord(substr($chunkafterCS,$j,1));
      fwrite($f,$chunkbeforeCS,148);
      $checksum=sprintf("%6s ",decoct($checksum));
      $bdchecksum=pack("a8", $checksum);
      fwrite($f,$bdchecksum,8);
      fwrite($f,$chunkafterCS,356);
      return true;
    }
    //\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
    // Writes file content to the tar file must be called after a TarAddHeader
    // f:file resource provided by fopen
    // phisfn: path to file
    //\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
    function TarWriteContents($f,$phisfn)
    {
      if (@is_dir($phisfn))
      {
        return;
      }
      else
      {
        $size=filesize($phisfn);
        $padding=$size % 512 ? 512-$size%512 : 0;
        $f2=fopen($phisfn,"rb");
        while (!feof($f2)) fwrite($f,fread($f2,1024*1024));
        $pstr=sprintf("a%d",$padding);
        fwrite($f,pack($pstr,''));
      }
    }
    //\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
    // Adds 1024 byte footer at the end of the tar file
    // f: file resource
    //\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
    function TarAddFooter($f)
    {
      fwrite($f,pack('a1024',''));
    }
    ?>
    
    katzlbtjunk's method is certainly shorter, but it is unusable for anything except small files. It would try to load the whole file into memory, then create an entire compressed copy, and only then write it to disk. The other method given below will not exhaust memory like that.
    Read the description of gzwrite() very carefully. If the 'length' option is not specified, then the input data will have slashes stripped on systems where magic quotes are enabled. This is important information to know when compressing files.
    <?php
    $data = fread($fp, 5000);
    gzwrite($fp2, $data, strlen($data));
    ?>
    Is the correct way to avoid issues with magic quotes.
    This function add a line to a .gz compressed file
    <?php
    function AppendLineGz($file,$string) {
      if (file_exists($file)) {
        $lines = gzfile($file);
        $lines[count($lines)] = "$string\r\n";
        $input=implode($lines);
      } else {$input="$string\r\n";}
      $gz = gzopen($file,'w9');
      gzwrite($gz, $input);
      gzclose($gz);  
    }
    ?>
    
    How about this instead:
    $s = file_get_contents('file.tar'); 
    file_put_contents('file.tar.gz',gzencode($s,9));

    上篇:gzuncompress()

    下篇:inflate_add()