gzwrite

(PHP 4, PHP 5, PHP 7, PHP 8)

gzwriteEscritura en un archivo gz, segura a nivel binario

Descripción

gzwrite(resource $stream, string $data, ?int $length = null): int|false

gzwrite() escribe el contenido de data al archivo gz dado.

Parámetros

stream

El apuntador al archivo gz. Debe ser válido y debe apuntar a un archivo abierto exitosamente por gzopen().

data

La cadena a escribir.

length

El número de bytes sin comprimir a escribir. Si se suministra, la escritura se detendrá después de que se hayan escrito los bytes (sin comprimir) del parámetro length o de que sea alcanzado el fin de la data, lo que ocurra primero.

Valores devueltos

Retorna el número de bytes (sin comprimir) escritos en el flujo del archivo gz dado, o false en caso de error.

Historial de cambios

Versión Descripción
8.0.0 length ahora es anulable; anteriormente, el valor predeterminado era 0.
7.4.0 Esta función ahora devuelve false en caso de fallo; antes se devolvía 0.

Ejemplos

Ejemplo #1 Ejemplo de gzwrite()

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

Ver también

  • gzread() - Lectura de archivo gz segura a nivel binario
  • gzopen() - Abre un archivo gz

add a note add a note

User Contributed Notes 6 notes

up
2
Kioob
20 years ago
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.
up
1
calmarius at nospam dot atw dot hu
15 years ago
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',''));
}

?>
up
1
Anonymous
15 years ago
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.
up
0
Take Heed
13 years ago
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.
up
-2
repository at lamaresh dot net
15 years ago
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);   
}
?>
up
-4
katzlbtjunk at hotmail dot com
16 years ago
How about this instead:
$s = file_get_contents('file.tar');
file_put_contents('file.tar.gz',gzencode($s,9));
To Top