如何确定gzip文件的内容长度? [英] How to determine the Content-Length of a gzipped file?

查看:228
本文介绍了如何确定gzip文件的内容长度?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

现在,我试图从服务器提供CSS和JS文件,但不会让我启用 mod_gzip mod_deflate 。所以我写了一个小PHP脚本来压缩GZIP并返回给用户。



示例代码:

  $ filename =style.css; $!
$ b if(!file_exists($ filename)||!($ info = stat($ filename))){
header(HTTP / 1.1 404 Not Found);
die();
}

header(Date:.gmdate(D,j M Y H:i:s e,time()));
header(Cache-Control:max-age = 2592000);
header(Last-Modified:.gmdate(D,j M Y H:i:s e,$ info ['mtime']));
header(Etag:.sprintf(\%x-%x-%x \,$ info ['ino'],$ info ['size'],$ info ['修改时间']));
头(Accept-Ranges:bytes);
header(Cache-Control:Expires.gmdate(D,j M Y H:i:s e,$ info ['mtime'] + 2592000));
header(Content-Type:text / html);

ob_start(ob_gzhandler);
echo file_get_contents($ filename);
ob_end_flush();

我现在有两个问题。首先,我无法确定压缩文件的结果大小,以通知浏览器内容长度。通常情况下,我会包含这一行:

  header(Content-Length:。$ info [size]); 

但是,如果我这样做,浏览器会在尝试等待更多数据时挂起。有没有办法计算总大小?或者我应该忽略这个头文件指令。



另一个问题是,无论何时我在Firefox中查看这个PHP文件,它都会尝试让我下载结果。在Chrome中,它就像我期望的那样显示它。有什么建议?



编辑:感谢SoapBox,我用下面的代码替换了代码的结尾:

  header(Content-Encoding:gzip); 
$ compressed = gzencode(file_get_contents($ filename),5);
header(Content-Length:.strlen($ compressed));
die($ compressed);

这对于内容长度非常有用!但我仍然让Firefox下载文件而不是显示它。 :(b / b)

再次编辑:这是修改的代码结束代码,由Cletus提供。

  //开始缓冲输出
ob_start();
//检查gzip能力
if(stripos($ _ SERVER [ ');
ob_start(ob_gzhandler);
echo file_get_contents($ filename);
ob_end_flush();
} else
echo file_get_contents($ filename);

//写入内容长度
header('Content-Length:'.ob_get_length());
ob_end_flush( );

我将开始一个新问题,以确定Firefox为何继续尝试下载file。

解决方案

这里的问题是,要知道内容长度,您需要知道客户端是否支持gzip编码,你已经使用ob_gzhandler委托了这个决定。从 HTTP H / b>


  ob_start(); 
ob_start('ob_gzhandler');

...输出页面内容...

ob_end_flush(); // ob_gzhandler one

header('Content-Length:'.ob_get_length());

ob_end_flush(); //主要的


完整版本:

  $ filename =style.css; $!
$ b if(!file_exists($ filename)||!($ info = stat($ filename))){
header(HTTP / 1.1 404 Not Found);
die();
}

header(Date:.gmdate(D,j M Y H:i:s e,time()));
header(Cache-Control:max-age = 2592000);
header(Last-Modified:.gmdate(D,j M Y H:i:s e,$ info ['mtime']));
header(ETag:.sprintf(\%x-%x-%x \,$ info ['ino'],$ info ['size'],$ info ['修改时间']));
头(Accept-Ranges:bytes);
header(Expires:.gmdate(D,j M Y H:i:s e,$ info ['mtime'] + 2592000));
header(Content-Type:text / css); //注意:出于某种原因,这是text / html?

ob_start();
ob_start(ob_gzhandler);
echo file_get_contents($ filename);
ob_end_flush();
header('Content-Length:'.ob_get_length());
ob_end_flush();

这比自己承担gzip编码问题要好得多< 。 / p>

Right now I'm trying to serve CSS and JS files from a server that won't let me enable mod_gzip or mod_deflate. So I wrote a small PHP script to compress with GZIP and return to the user.

Example Code:

$filename = "style.css";

if (!file_exists($filename) || !($info = stat($filename))) {
  header("HTTP/1.1 404 Not Found");
  die();
}

header("Date: ".gmdate("D, j M Y H:i:s e", time()));
header("Cache-Control: max-age=2592000");
header("Last-Modified: ".gmdate("D, j M Y H:i:s e", $info['mtime']));
header("Etag: ".sprintf("\"%x-%x-%x\"", $info['ino'], $info['size'], $info['mtime']));
header("Accept-Ranges: bytes");
header("Cache-Control: Expires ".gmdate("D, j M Y H:i:s e", $info['mtime']+2592000));
header("Content-Type: text/html");

ob_start("ob_gzhandler");
echo file_get_contents($filename);
ob_end_flush();

I'm having two problems right now. The first is, I'm having trouble determining the resulting size of the compressed file to inform the browser of the content-length. Normally, I would include this line:

header("Content-Length: ".$info["size"]);

But, if I do, the browser hangs while trying to wait for more data. Is there a way to calculate the total size? Or should I ignore this header directive.

The other issue is, whenever I view this PHP file in Firefox, it tries to have me download the result. In Chrome, it just displays it like I would expect. Any suggestions?

Edit: Thanks to SoapBox, I replaced the end of the code with this:

header("Content-Encoding: gzip");
$compressed = gzencode(file_get_contents($filename), 5);
header("Content-Length: ".strlen($compressed));
die($compressed);

This works great for the content-length! But I'm still getting Firefox to download the file instead of display it. :(

Edit Again: Here is the modified end-of-code code, courtesy of Cletus.

// Start buffered output
ob_start();
// Check for gzip capability
if (stripos($_SERVER['HTTP_ACCEPT_ENCODING'], "gzip") !== false) {
  ob_start("ob_gzhandler");
  echo file_get_contents($filename);
  ob_end_flush();
} else
  echo file_get_contents($filename);

// Write the content length
header('Content-Length: '.ob_get_length());
ob_end_flush();

I'm going to start a new question to figure out why Firefox keeps trying to download the file.

解决方案

The problem here is that to know the content length you need to know whether or not the client supports gzip encoding and you've delegated that decision by using ob_gzhandler. From HTTP Headers:

ob_start();
ob_start('ob_gzhandler');

  ... output the page content...

ob_end_flush();  // The ob_gzhandler one

header('Content-Length: '.ob_get_length());

ob_end_flush();  // The main one

Complete version:

$filename = "style.css";

if (!file_exists($filename) || !($info = stat($filename))) {
  header("HTTP/1.1 404 Not Found");
  die();
}

header("Date: ".gmdate("D, j M Y H:i:s e", time()));
header("Cache-Control: max-age=2592000");
header("Last-Modified: ".gmdate("D, j M Y H:i:s e", $info['mtime']));
header("ETag: ".sprintf("\"%x-%x-%x\"", $info['ino'], $info['size'], $info['mtime']));
header("Accept-Ranges: bytes");
header("Expires: ".gmdate("D, j M Y H:i:s e", $info['mtime']+2592000));
header("Content-Type: text/css"); // note: this was text/html for some reason?

ob_start();
ob_start("ob_gzhandler");
echo file_get_contents($filename);
ob_end_flush();
header('Content-Length: '.ob_get_length());
ob_end_flush();

This is much better than taking on the gzip encoding issue yourself.

这篇关于如何确定gzip文件的内容长度?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆