Comment faire pour déterminer la Longueur du Contenu d'un fichier au format gzip?

Droit maintenant, je suis en train de servir les fichiers CSS et JS à partir d'un serveur qui ne me permet pas d'activer mod_gzip ou mod_deflate. J'ai donc écrit un petit script PHP pour compresser avec GZIP et retourner à l'utilisateur.

Exemple De 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();

Je vais avoir deux problèmes en ce moment. Le premier est, je vais avoir de la difficulté à déterminer la taille du fichier compressé afin d'informer le navigateur de la longueur du contenu. Normalement, je voudrais inclure cette ligne:

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

Mais, si je le fais, le navigateur se bloque en essayant d'attendre pour plus de données. Est-il un moyen de calculer la taille totale? Ou dois-je ignorer cette en-tête de la directive.

L'autre problème est, à chaque fois que je l'ai vue ce fichier PHP dans Firefox, il essaie de me télécharger le résultat. Dans google Chrome, il affiche juste comme je m'attends. Des suggestions?

Edit: Grâce à la boîte à savon, je l'ai remplacé à la fin du code:

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

Cela fonctionne très bien pour la longueur du contenu! Mais je suis encore en train de Firefox pour télécharger le fichier au lieu de l'afficher. 🙁

Modifier à Nouveau: Ici est de la modification de la fin-de-code code, avec l'aimable autorisation de 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();

Je vais commencer une nouvelle question afin de comprendre pourquoi Firefox continue d'essayer de télécharger le fichier.

Certains en-têtes dans les réponses ont quelques erreurs; Le double Cache-Control, la ligne avec Cache-Control: Expire.... devrait être Expire: ... Et Etag devrait être ETag.

OriginalL'auteur St. John Johnson | 2009-05-03