PHP 大会日本 2024

Zlib 函数

目录

添加注释

用户贡献的注释 19 个注释

8
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 上。
与往常一样,您的里程可能会有所不同。
4
mlevy at rgj dot com
21 年前
如果您打开 zlib.output_compression_level,请注意,您不应该尝试在脚本中刷新()输出。PHP 将添加 gzip 标头,但会发送未压缩的输出,这会对 Mozilla 造成严重破坏。不过,IE 似乎可以处理它。
6
Brian
17 年前
如果您的脚本启动时(在 php.ini 或通过 apache 指令中)将 zlib.output_compression 设置为打开,然后您在生成输出之前使用 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
20 年前
我的 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 already exists");
}
} else {
error_log("$src doesn't exist");
}
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 配置文件中启用它(.htaccess 也应该可以),使用以下行
php_flag zlib.output_compression on

我花了几个小时才解决这个问题,所以希望它能帮助其他人。

顺便说一句,我使用的是 Apache/2.2.4 (Ubuntu) PHP/5.2.3-1ubuntu6.3。
3
Bob
19年前
与文档中所述相反,我无法通过 ini_set() 使 zlib.output_compression 工作(即使我将其放在文件的最开头,在发送任何输出之前),从 php 4.3.11 开始。虽然它确实被设置为 true,但实际上不会执行任何操作。这意味着如果您不通过 php.ini 或 Apache 配置来设置它,则无法使用。我必须使用 ob_start("ob_gzhandler"); 代替。
3
djmaze(AT)dragonflycms(.)org
19年前
如果您需要压缩数据并将其作为“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
Arne dot Heizmann at csr dot com
18 年前
此处为 PHP 版本 5.1.4。Bob 所说的即使在这个版本(撰写本文时最新的版本)中也是正确的。您无法通过 ini_set() 启用 zlib.output_compression。您必须使用 php.ini。
1
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
monte at ispi dot net
23年前
处理 gzip 压缩的另一种方法是让 apache 的 mod_gzip 模块来处理它。这似乎与 phpbuilder.com 上的教程相矛盾,该教程说它不会压缩 php(或任何动态)输出,但 mod_gzip 从 1.3.17.1a 版本开始对我很有效。

这是一个 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 或 mime 类型为 x-httpd-php 的文件的输出。确保将 dechunk 设置为 Yes。
1
jpleveille at webgraphe dot com
19年前
register_shutdown_function() (https://php.net/register_shutdown_function) 如果您使用 zlib.output_compression,则不会输出任何内容。

关闭函数在关闭所有打开的输出缓冲区后调用,因此,例如,如果启用了 zlib.output_compression,则其输出不会被压缩。
1
thivierr at telus dot net
21 年前
我发现读取 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,所以我不能 100% 确定哪个行为在哪个版本中开始。
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 使用率差异。
1
php at seven dot net dot nz
18 年前
zlib.output_compression 在 IE 6 中给我带来了问题,页面有时无法显示。这可能很难追踪,并且 PHP 也不打算修复它,所以如果发生这种情况,希望您能在搜索中找到此注释。

http://bugs.php.net/bug.php?id=38026
0
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
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