Zlib 函数

目录

添加说明

用户贡献说明 19 个说明

9
anzenews at volja dot net
18 年前
php at seven dot net dot nz
您是否一直在使用 register_shutdown_function() 来输出一些内容?如果是,部分输出没有被编码,而 IE6 对此非常不友好。在我的案例中,它会重新加载页面,有时会显示空白页面。因此 IE6 会得到无效的流,错误不是假的,只是描述不够好。

jpleveille at webgraphe dot com
在 PHP 4.4.2 中,register_shutdown_function() 会输出您想要的任何内容,但它不会与文档的其余部分一起编码。这更糟糕,因为您会得到一个难以/无法追踪的错误。
5
zigazou at free dot fr
20 年前
如果您在 php.ini 文件中使用 "zlib.output_compression = On",并激活输出缓冲 (ob_start),请不要输出此标头
header('Content-Length: '.ob_get_length());

这是因为 ob_get_length() 会返回未压缩的大小,而 zlib 会压缩输出。因此,您的浏览器会感到困惑,等待永远不会出现的额外数据。
4
gem at rellim dot com
20 年前
运行,不要走,快跑,将此添加到您的 Apache 配置文件中

php_flag zlib.output_compression On
php_value zlib.output_compression_level 5

我刚刚尝试了这一点,并且在我的
一些成熟的 PHP 页面上实现了 10 倍和 15 倍的速度提升。我已经坐下来为这些页面获得 5% 的提升。我在关键页面上使用 microtime() 来帮助我跟踪页面速度,这证实了速度的提升。PHP 页面在开始和结束时记录时间戳,然后记录页面持续时间。因此,任何 IP 传输影响都不包括在内。对用户来说,有一个
明显的客观差异。

测试系统是 PHP 4.3.6、Apache 2.0.49 在 Linux 2.4 上。
一如既往,YMMV。
4
mlevy at rgj dot com
21 年前
如果您打开 zlib.output_compression_level,请注意,您不应该尝试在脚本中刷新() 输出。PHP 会添加 gzip 标头,但会以未压缩的方式发送输出,这会给 Mozilla 带来混乱。IE 似乎可以处理,不过。
6
Brian
17 年前
如果您在脚本启动时 (在 php.ini 或通过 apache 指令中) 将 zlib.output_compression 设置为 on,然后在生成输出之前使用 ini_set() 在运行时将其禁用,您的输出仍然会被缓冲!即使您调用 ob_implicit_flush()。

如果您想要非缓冲输出,您必须在脚本启动之前禁用 zlib.output_compression (当然也要禁用 mod_gzip,如果您同时安装了这两个模块)。

此行为在服务器上发生:Apache/1.3.33 (Debian GNU/Linux) mod_gzip/1.3.26.1a PHP/4.3.10-18
5
admin_at_commandline_dot_ch
19 年前
我的 gzip 函数。

此函数一次只读取、压缩和写入一小块数据,这样您就可以在没有内存问题的情况下压缩大型文件...

<?php
function gzip($src, $level = 5, $dst = false){
if(
$dst == false){
$dst = $src.".gz";
}
if(
file_exists($src)){
$filesize = filesize($src);
$src_handle = fopen($src, "r");
if(!
file_exists($dst)){
$dst_handle = gzopen($dst, "w$level");
while(!
feof($src_handle)){
$chunk = fread($src_handle, 2048);
gzwrite($dst_handle, $chunk);
}
fclose($src_handle);
gzclose($dst_handle);
return
true;
} else {
error_log("$dst 已经存在");
}
} else {
error_log("$src 不存在");
}
return
false;
}
?>
5
Robin Skoglund
16 年前
ini_set('zlib.output_compression', 'On') 不起作用

它说 zlib.output_compression 是 PHP_INI_ALL 可更改的,但在我的情况下,至少这不是真的。当在运行时使用 ini_set('zlib.output_compression', 'On') 时,phpinfo() 指出 zlib.output_compression 已启用,但没有压缩。

由于我不想在所有站点上启用 php.ini 中的 zlib.ouput_compression,我的解决方案是在 apache conf 中启用它 (.htaccess 也应该可以工作),使用以下行
php_flag zlib.output_compression on

我花了几个小时才弄清楚这一点,所以我希望它能帮助其他人。

顺便说一句,我正在使用 Apache/2.2.4 (Ubuntu) PHP/5.2.3-1ubuntu6.3。
3
Bob
18 年前
与文档中所说的相反,到目前为止 (PHP 4.3.11),我无法通过 ini_set() 使 zlib.output_compression 工作 (即使我将其放在文件的最开头,在发送任何输出之前)。虽然它确实被设置为 true,但它实际上不会做任何事情。这意味着如果您没有通过 php.ini 或 Apache 配置设置它,那就行不通。我必须改用 ob_start("ob_gzhandler");。
3
djmaze(AT)dragonflycms(.)org
18 年前
如果您需要压缩数据并将其作为“Content-disposition: attachment”以“实时”的方式发送给客户端(例如,由于大小为 40Mb),可以使用以下技巧:使用 ob_gzhandler()。

请记住,$str 是要输出的内容。

当您开始输出调用时

<?php
echo ob_gzhandler($str, PHP_OUTPUT_HANDLER_START);
?>

然后,要输出任何其他内容

<?php
echo ob_gzhandler($str, PHP_OUTPUT_HANDLER_CONT);
?>

要关闭输出

<?php
echo ob_gzhandler('', PHP_OUTPUT_HANDLER_END);
exit;
?>

仅在 Apache 1.3.33 和 PHP 5.0.4 上测试。
2
php at seven dot net dot nz
18 年前
zlib.output_compression 在 IE 6 中给我带来了问题,有时页面无法显示。这可能很难追踪,而且 PHP 也不打算修复它,所以如果您遇到了这种情况,希望您能在搜索中找到此注释。

http://bugs.php.net/bug.php?id=38026
2
Arne dot Heizmann at csr dot com
18 年前
我使用的是 PHP 版本 5.1.4。Bob 的说法即使在这个版本(截至撰写本文时最新的版本)也是正确的。您无法通过 ini_set() 启用 zlib.output_compression。您必须使用 php.ini。
1
jpleveille at webgraphe dot com
19 年前
如果您使用 zlib.output_compression,则 register_shutdown_function() (https://php.net/register_shutdown_function) 不会输出任何内容。

关闭函数在关闭所有打开的输出缓冲区后调用,因此,例如,如果启用了 zlib.output_compression,则其输出将不会被压缩。
1
thivierr at telus dot net
20 年前
我发现读取 gzip 文件最简单的方法如下所示

echo file_get_contents("compress.zlib:///myphp/test.txt.gz");

要创建 gzip 文件
file_put_contents("compress.zlib:///myphp/test.txt.gz","Put this in the file\r\n");

关于此需要注意的事项
- 最佳前缀是“compress.zlib”,而不是“zlib”。
- 如果您希望指定从根路径开始的路径,则实际上您最终会得到三个斜杠。上面的路径对应于 unix 上的“/myphp/test.txt”,以及 Windows 上的“c:\myphp\test.txt”(如果 C: 是当前驱动器)。我只在 Windows 上测试过它。
- 压缩和解压缩都使用相同的前缀“compress.zlib://”(再加上一个斜杠来获取根目录)。
- 我使用的是 5.0,因此我不确定哪个行为是在哪个版本中开始的。
1
chris at mad-teaparty dot com
21 年前
不错的函数。我反过来做了

function uncompress($srcName, $dstName) {
$zp = gzopen($srcName, "r");
while(!gzeof($zp))
$string .= gzread($zp, 4096);
gzclose($zp);

$fp = fopen($dstName, "w");
fwrite($fp, $string, strlen($string));
fclose($fp);
}

uncompress("./myfile.txt.gz", "./myfile.txt");

更短的方法是

function uncompress($srcName, $dstName) {
$string = implode("", gzfile($srcName));
$fp = fopen($dstName, "w");
fwrite($fp, $string, strlen($string));
fclose($fp);
}
1
ghassler at speakeasy dot net
19 年前
我测试了所有压缩级别,针对一个 22k 的页面,以下是我得到的结果(以字节为单位)

off = 22549
1 = 4297
2 = 4279
3 = 4264
4 = 4117
5 = 4097
6 = 4063
7 = 4011
8 = 3998
9 = 3996

看起来 zlib.output_compression_level 最佳选择是 1 或 5。默认值 6 也可能没问题。不过,我不知道它们之间的 CPU 使用率差异。
2
monte at ispi dot net
23 年前
处理 gzip 压缩的另一种方法是让 apache 的 mod_gzip 模块来处理它。这似乎与 phpbuilder.com 上的教程相矛盾,该教程说它不会压缩 php(或任何动态)输出,但截至版本 1.3.17.1a 的 mod_gzip 对我来说运行良好。

以下是一个 httpd.conf 设置示例

<IfModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_minimum_file_size 300
mod_gzip_maximum_file_size 0
mod_gzip_maximum_inmem_size 100000
mod_gzip_keep_workfiles No
mod_gzip_temp_dir /tmp
mod_gzip_item_include file \.html$
mod_gzip_item_include file \.jsp$
mod_gzip_item_include file \.php$
mod_gzip_item_include file \.pl$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-httpd-php
mod_gzip_item_include mime ^httpd/unix-directory$
mod_gzip_item_include handler ^perl-script$
mod_gzip_item_include handler ^server-status$
mod_gzip_item_include handler ^server-info$
mod_gzip_item_exclude mime ^image/.*
</IfModule>

这将自动压缩所有具有 .php 扩展名或 x-httpd-php 类型的文件的输出。确保将 dechunk 设置为 Yes。
0
spam at wildpeaks dot com
20 年前
为了解压缩,我修改了之前发布的一个函数(这样 $string 不会有很大的尺寸,这可能会超过内存限制,如果压缩文件很大)

function file_ungzip($fromFile, $toFile) {
$zp = @gzopen($fromFile, "r");
$fp = @fopen($toFile, "w");
while(!@gzeof($zp)) {$string = @gzread($zp, 4096); @fwrite($fp, $string, strlen($string));}
@gzclose($zp);
@fclose($fp);
}
-1
ec10 at gmx dot net
20 年前
/**
* @return bool
* @param string $in
* @param string $out
* @param string $param = "1"
* @desc 使用 zlib 扩展压缩文件
*/
function gzip ($in, $out, $param="1")
{
if (!file_exists ($in) || !is_readable ($in))
return false;
if ((!file_exists ($out) && !is_writable (dirname ($out)) || (file_exists($out) && !is_writable($out)) ))
return false;

$in_file = fopen ($in, "rb");
if (!$out_file = gzopen ($out, "wb".$param)) {
return false;
}

while (!feof ($in_file)) {
$buffer = fgets ($in_file, 4096);
gzwrite ($out_file, $buffer, 4096);
}

fclose ($in_file);
gzclose ($out_file);

return true;
}

/**
* @return bool
* @param string $in
* @param string $out
* @desc 使用 zlib 扩展解压缩文件
*/
function gunzip ($in, $out)
{
if (!file_exists ($in) || !is_readable ($in))
return false;
if ((!file_exists ($out) && !is_writable (dirname ($out)) || (file_exists($out) && !is_writable($out)) ))
return false;

$in_file = gzopen ($in, "rb");
$out_file = fopen ($out, "wb");

while (!gzeof ($in_file)) {
$buffer = gzread ($in_file, 4096);
fwrite ($out_file, $buffer, 4096);
}

gzclose ($in_file);
fclose ($out_file);

return true;
}
-3
xorinox at tiscali dot ch
20 年前
看看这个扩展版本 :)

<?php

function compress( $srcFileName, $dstFileName )
{
// 获取文件内容
$fp = fopen( $srcFileName, "r" );
$data = fread ( $fp, filesize( $srcFileName ) );
fclose( $fp );

// 编写压缩文件
$zp = gzopen( $dstFileName, "w9" );
gzwrite( $zp, $data );
gzclose( $zp );
}

function
uncompress( $srcFileName, $dstFileName, $fileSize )
{
// 获取压缩文件的內容
$zp = gzopen( $srcFileName, "r" );
$data = fread ( $zp, $fileSize );
gzclose( $zp );

// 编写解压缩文件
$fp = fopen( $dstFileName, "w" );
fwrite( $fp, $data );
fclose( $fp );
}

compress( "tmp/supportkonzept.rtf", "tmp/_supportkonzept.rtf.gz" );
uncompress( "tmp/_supportkonzept.rtf.gz", "tmp/_supportkonzept.rtf", filesize( "tmp/supportkonzept.rtf" ) );

?>
To Top