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.
OriginalL'auteur St. John Johnson | 2009-05-03
Vous devez vous connecter pour publier un commentaire.
Le problème ici est que, pour connaître le contenu de la longueur que vous devez savoir si oui ou non le client prend en charge l'encodage gzip et vous avez délégué de la décision en utilisant ob_gzhandler. De Les en-Têtes HTTP:
Version complète:
C'est beaucoup de mieux que de prendre sur le gzip problème de codage de vous-même.
OriginalL'auteur cletus
Vous devez d'abord faire tout le gzip et de mesurer le résultat (en tenant le contenu dans la mémoire, ou les écrire sur le disque que vous compresser puis stat avec le format de fichier), puis d'écrire le Contenu de l'en-tête de Longueur et ensuite envoyer le contenu du fichier.
Ou de l'utilisation encodage de transfert en bloc.
file_put_contents
devrait fonctionner sur elle.OriginalL'auteur Jeremy Huiskamp
À résoudre votre firefox question, je pense que vous devez inclure
header( "Content-Encoding: gzip" );
de sorte que le navigateur sait pour décompresser le contenu.Comme pour la longueur du contenu, vous pouvez essayer de laisser cette valeur off, ou essayez de trouver un moyen d'utiliser "Transfer-Encoding: chunked" (vous ne pouvez pas simplement envoyer cet en-tête, vous devez la formater les données spécialement pour elle). Il est possible que
ob_end_flush
active automatiquement le chunking.Je vous recommande de prendre wireshark et de capturer ce que votre script php est de l'envoi et de la comparer à un comportement de serveur pour voir ce que les en-têtes, etc sont manquants.
OriginalL'auteur SoapBox