2010-06-16 3 views
10

J'ai besoin de pré-compresser de très gros fichiers html/xml/json (gros fichiers de données) en utilisant gzip ou deflate. Je ne veux jamais servir les fichiers non compressés. Ils sont si grands et répétitifs que la compression fonctionnera très probablement très bien, et bien que certains navigateurs plus anciens ne puissent pas supporter la décompression, mes clients habituels ne les utiliseront pas (bien que ce serait bien si je pouvais générer une sorte de mettre à jour le message de votre navigateur)Comment pré-compresser de très gros fichiers html

Je génère automatiquement les fichiers et je peux facilement générer des fichiers .htaccess pour accompagner chaque type de fichier. Essentiellement ce que je veux, c'est toujours sur la version mod_gunzip. Parce que les fichiers sont volumineux, et parce que je les servirai à plusieurs reprises, j'ai besoin d'une méthode qui me permet de compresser une fois, vraiment bien, sur la ligne de commande.

J'ai trouvé des informations sur ce site et d'autres sur la façon de le faire avec gzip, mais je me demandais si quelqu'un pouvait me dire comment faire cela avec deflate. Des points bonus pour une réponse complète qui comprend à quoi devrait ressembler mon fichier .htaccess, ainsi que le code de ligne de commande que je devrais utiliser (GNU/Linux) pour obtenir une compression optimale. Points de bonus super pour une réponse qui traite également de la façon d'envoyer un message «Désolé de ne pas vous envoyer de fichier» aux navigateurs non conformes.

serait adorable si nous pouvions créer un "précompression" tag pour couvrir des questions comme celle-ci.

-FT

+0

vous pourriez obtenir de meilleures réponses de serverfault.com –

+0

Ressemble à une copie de http://stackoverflow.com/questions/75482/how-can-i-pre-compress-files-with-mod-deflate-in- apache-2-x – skaffman

+0

Cela a été utile, mais ne parle que de gzip et non de dégonfler la pré-compression. Il est également dans un environnement de rails et pas un php (bien que toujours apache). Les similitudes dans les messages plaident en faveur d'une balise precompressionn – ftrotter

Répondre

8

Edit: Trouvé AddEncoding in mod_mime

Cela fonctionne:

<IfModule mod_mime.c> 
<Files "*.html.gz"> 
    ForceType text/html 
</Files> 
<Files "*.xml.gz"> 
    ForceType application/xml 
</Files> 
<Files "*.js.gz"> 
    ForceType application/javascript 
</Files> 
<Files "*.gz"> 
    AddEncoding gzip .gz 
</Files> 
</IfModule> 

Les documents font sonner comme seul le AddEncoding devrait être nécessaire, mais je n'ai pas que pour travailler.

De plus, le mod_compression de Lighttpd peut compresser et mettre en mémoire cache (les fichiers compressés).

+0

Si vous pouvez inclure le code de type mime, j'accepte cette réponse, on dirait que personne ne va me donner une réponse complète, y compris l'option deflate ... – ftrotter

+0

Serait-ce aussi un: ' En-tête Content-Encoding: dégonfler'? – maxwellb

0

Un moyen rapide pour compresser le contenu sans traiter directement avec moz_gzip/mod_defalte est d'utiliser ob_gzhandler et en modifiant les en-têtes (avant toute sortie est envoyée au navigateur).

<?php 
/* Replace CHANGE_ME with the correct mime type of your large file. 
i.e: application/json 
*/ 

ob_start ('ob_gzhandler'); 
header('Content-type: CHANGE_ME; charset: UTF-8'); 
header('Cache-Control: must-revalidate'); 
$offset = 60 * 60 * 2 ; 
$ExpStr = 'Expires: ' . gmdate('D, d M Y H:i:s',time() + $offset) . ' GMT'; 
header($ExpStr); 

/* Stuff to generate your large files here */ 
+0

Cela fonctionne gzip à la volée. Je mais le fichier existe déjà en tant que html/json/xml/quoi que ce soit sur le disque. Je suppose que je pourrais utiliser PHP comme ceci pour générer les bons en-têtes puis faire écho au fichier (ou équivalent) mais n'est-ce pas là un moyen de le faire en apache? – ftrotter

2

Pour la ligne de commande, la compilation de zpipe de zlib: http://www.zlib.net/zpipe.c puis

zpipe <BIGfile.html> BIGfile.htmlz 

par exemple. Puis, en utilisant l'exemple de Zash, configurez un filtre pour changer l'en-tête. Cela devrait vous fournir des fichiers RAW dégonfler, quels navigateurs modernes probably support.

Pour une autre façon de compresser les fichiers, jetez un oeil à l'utilisation de pigz avec les options de compression zlib (-z) ou PKWare zip (-K). Teste si ces travaux arrivent avec l'ensemble Content-Encoding.

+0

Oh, et remplacez Z_DEFAULT_COMPRESSION dans zpipe par Z_BEST_COMPRESSION. – maxwellb

+0

est-ce que cela fait "déflater" la compression ou simplement gzip? – ftrotter

+0

zpipe, au moins, se dégonfle. Essayez de configurer un fichier de test pour la compression pigz, honnêtement, je n'ai tout simplement pas l'environnement de test pour le tester moi-même en ce moment. Pigz compressera également plus rapidement en utilisant plusieurs cœurs. Courtiser. – maxwellb

3

Si j'étais vous, je regarderais la compression du système de fichiers intégrée au lieu de le faire au niveau de la couche apache. Sur solaris zfs a une compression transparente, utilisez zfs compress pour compresser le système de fichiers. De même, Windows peut compresser des dossiers, Apache servira le contenu inconscient du fait qu'il est compressé sur le disque. Linux a aussi des systèmes de fichiers qui font de la compression transparente.

+0

super commentaire. Quel système de fichiers sous Linux et quel conseil pour le faire dans une instance de cloud? Comment régler correctement les en-têtes (pour que les clients puissent comprendre le contenu?) – ftrotter

+0

Ce n'est pas aussi élégant sur Linux, mais il y a des modules de fusibles qui feront une compression/décompression transparente. Comme celui-ci: http://miio.net/wordpress/projects/fusecompress/ Vous n'auriez rien à faire avec les en-têtes d'Apache, car pour Apache, ce sont des fichiers normaux. :-) – Jubal

+2

Je ne vois pas comment cette réponse résout le problème. Il semble que ftrotter veut pré-compresser les fichiers pour économiser le temps de traitement au moment de la requête. Si vous utilisez une compression de système de fichiers transparente, Apache devra encore recompresser au moment de la requête. –

Questions connexes