PHP 8.1.28 Released!

gzcompress

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

gzcompressComprime una cadena

Descripción

gzcompress(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_DEFLATE): string|false

Esta función comprime la cadena dada usando el formato de datos ZLIB.

Para detalles sobre el algoritmo de compresión ZLIB, ver el documento "» ZLIB Compressed Data Format Specification version 3.3" (RFC 1950).

Nota:

Esto no es lo mismo que la compresión que gzip, la cuál incluye algunos encabezados de datos. Ver gzencode() para la compresión gzip.

Parámetros

data

Los datos a comprimir.

level

El nivel de compresión. Se puede dar como 0 para ninguna compresión, hasta 9 para la máxima compresión.

Si se utiliza -1, se usará la compresión por defecto de la librería zlib la cual es 6.

encoding

Una de las constentes ZLIB_ENCODING_*.

Valores devueltos

La cadena comprimida o false si ocurre un error.

Ejemplos

Ejemplo #1 Ejemplo de gzcompress()

<?php
$compressed
= gzcompress('Compress me', 9);
echo
$compressed;
?>

Ver también

add a note

User Contributed Notes 2 notes

up
6
@boas.anthro.mnsu.edu
23 years ago
No, it doesn't return gzip compressed data -- specifically, the CRC is messed up. However, after massaging the output a lot, I have come up with a solution. I also commented it a lot, pointing out odd things.

<?php
// Start the output buffer
ob_start();
ob_implicit_flush(0);

// Output stuff here...

// Get the contents of the output buffer
$contents = ob_get_contents();
ob_end_clean();

// Tell the browser that they are going to get gzip data
// Of course, you already checked if they support gzip or x-gzip
// and if they support x-gzip, you'd change the header to say
// x-gzip instead, right?
header("Content-Encoding: gzip");

// Display the header of the gzip file
// Thanks ck@medienkombinat.de!
// Only display this once
echo "\x1f\x8b\x08\x00\x00\x00\x00\x00";

// Figure out the size and CRC of the original for later
$Size = strlen($contents);
$Crc = crc32($contents);

// Compress the data
$contents = gzcompress($contents, 9);

// We can't just output it here, since the CRC is messed up.
// If I try to "echo $contents" at this point, the compressed
// data is sent, but not completely. There are four bytes at
// the end that are a CRC. Three are sent. The last one is
// left in limbo. Also, if we "echo $contents", then the next
// byte we echo will not be sent to the client. I am not sure
// if this is a bug in 4.0.2 or not, but the best way to avoid
// this is to put the correct CRC at the end of the compressed
// data. (The one generated by gzcompress looks WAY wrong.)
// This will stop Opera from crashing, gunzip will work, and
// other browsers won't keep loading indefinately.
//
// Strip off the old CRC (it's there, but it won't be displayed
// all the way -- very odd)
$contents = substr($contents, 0, strlen($contents) - 4);

// Show only the compressed data
echo $contents;

// Output the CRC, then the size of the original
gzip_PrintFourChars($Crc);
gzip_PrintFourChars($Size);


// Done. You can append further data by gzcompressing
// another string and reworking the CRC and Size stuff for
// it too. Repeat until done.


function gzip_PrintFourChars($Val)
{
for (
$i = 0; $i < 4; $i ++)
{
echo
chr($Val % 256);
$Val = floor($Val / 256);
}
}
?>
up
3
detain at interserver dot net
6 years ago
gzipped strings include header/metadata you can use to determine if a string is gzipped or not , but since gzcompress does not include that I found myself needing a way to determine if a string was compressed or not. After some research (and then improvements) i came up with this:

/**
* determines if a string is a gzipped string supporting strings
* encoded with either gzencode or gzcompress
*
* @param string $string the string to check for compression
* @return bool whether or not the string was compmressed
*/
function is_gzipped($string) {
return mb_strpos($string, "\x1f\x8b\x08", 'US-ASCII') === 0 && @gzuncompress($string) !== FALSE;
}
To Top