Toon posts:

Chunked gzip compressie

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hi iedereen,

De afgelopen dagen hier hebben in het thema van gzip compressie gestaan om onze traffic wat terug te dringen en de pagina's sneller te laten laden bij de gebruiker. Wij hebben pagina's met veel redundancy en dit is dus goed te compressen.
Omdat ik ook .php scripts on-the-fly wil compressen ben ik bezig met een uitgebreide class om dit te regelen.
Deze class is (/was) eigenlijk een template class (een van de vele), maar daar ben ik nu extra functionaliteit aan toe aan het voegen.

Wat ik wil weten: wanneer gzip compressed data als 'chunks' wordt overgestuurd, wordt dan elke chunk apart gegzipped? Hoe zit dat gzip formaat precies in elkaar? Bevat deze ook headers, of is het een encoding waar ik gewoon twee gzipjes achter elkaar zou kunnen plakken?

Even om het plaatje te maken: ik wil bepaalde delen van de geparsede template gegzipped cachen. Andere delen, die bij elke aanroep verschillend zijn, wil ik ongecached laten en dus on-the-fly gzippen. Denk hierbij aan de header en footer van elke page die gecached worden, en de body van de pagina die on-the-fly wordt gegzipped.

Wel nu, is dit mogelijk?

Alvast bedankt!

Groet,

Robin

Verwijderd

Topicstarter
Hmm, ik ben alvast verder aan het spelen geweest.. volgens mij kan gzip dit wel aan :)

Dit deed ik:

echo hello world >test1.txt
echo bye bye world >test2.txt
gzip test1.txt
gzip test2.txt
copy /b test1.txt.gz + /b test2.txt.gz > test3.gz
gzip -d test3.gz

resultaat is dan een file "test3" met inhoud:
"hello world
bye bye world
"

GZip heeft dus kennelijk niet zo'n probleem met twee gzipjes achter elkaar plakken..
Maar de browser checkt ook weer op een crc enzo, nu weet ik niet precies hoe we dit dan gaan oplossen :S

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:26
Je bent niet de enige die daar over nagedacht heeft en zoals je al zegt, kan je gzipjes gegarandeerd aan elkaar plakken.

Uit de gzip man-page:
Multiple compressed files can be concatenated. In this
case, gunzip will extract all members at once. For exam-
ple:

gzip -c file1 > foo.gz
gzip -c file2 >> foo.gz

Then
gunzip -c foo

is equivalent to

cat file1 file2

Verwijderd

Dat zijn files...
Maar naar de browser toe, moet het volgens mij een geheel zijn.
Dus die header en footer zal je ook gewoon on-the-fly mee moeten compressen.. kost toch geen drol qua performance.

dus standaard methode:
PHP:
1
2
3
4
5
6
7
8
  $hoofd = '<html>';
  $voet = '</html>';

  $spul = '<b>Hello world</b>';

  $uitput = $hoofd.$spul.$voet;

  doe_je_gzip_ding($uitput);


edit:

Of je moet inderdaad een nieuwe CRC forgen voor het geheel..
maar dat is voor de CPU nog meer moeite dan eventjes die header en footer opnieuw gzippen.

[ Voor 0% gewijzigd door Verwijderd op 23-10-2002 15:16 . Reden: Mjah.. crc kan ook ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:26
Verwijderd schreef op 23 oktober 2002 @ 15:12:
Dat zijn files...
Maar naar de browser toe, moet het volgens mij een geheel zijn.
gzip doet niet aan files. Die neemt gewoon een bytestream, vandaar dat er stond dat het resultaat equivalent was met een cat-operatie (waarbij de bestanden ook aan elkaar geplakt worden).
Dus die header en footer zal je ook gewoon on-the-fly mee moeten compressen. kost toch geen drol qua performance.
Het maakt waarschijnlijk weinig uit inderdaad, maar het kan dus heel goed.
Of je moet inderdaad een nieuwe CRC forgen voor het geheel..
maar dat is voor de CPU nog meer moeite dan eventjes die header en footer opnieuw gzippen.
Welke CRC heb je het dan over? En waarom zou je daar iets mee moeten forgen? (Dan is het nut van een CRC weg?)

Verwijderd

Soultaker schreef:
gzip doet niet aan files. Die neemt gewoon een bytestream, vandaar dat er stond dat het resultaat equivalent was met een cat-operatie (waarbij de bestanden ook aan elkaar geplakt worden).
Idd.
maar even voor de duidelijkheid, zeg maar. Want in het voorbeeld dat hij gaf, plakte hij 2 files aan elkaar.
Welke CRC heb je het dan over? En waarom zou je daar iets mee moeten forgen? (Dan is het nut van een CRC weg?)
Die moet dus opnieuw gemaakt worden: Als je al 2 bestaande gzippies hebt, en daartussen een derde wil plakken, moet je dus de crc herberekenen..

Mijn punt was gewoon dit:
Laat die head/foot lekker platte text, dan kan je de hele zwik in 1x gegzipt op de lijn gooien. Daar zijn std. classes voor (of je schrijft zelf ff een routine).. lekker snel, bugproof, en duidelijk. :)

Verwijderd

Topicstarter
Aan het eind van een gzip compressed HTML file wordt een 32 bit crc checksum meegestuurd en de lengte van het bestand (ook 32 bit integer).
Nu zou ik de source van de gecachede & gecompressede data moeten inlezen om die crc checksum weer te berekenen. Op zich geen probleem, maar ik vroeg me af of ik die crc ook niet sequential (of incremental, hoe je het ook wil zeggen) kan toepassen.
Als ik het goed herinner moet dat wel kunnen met CRC, alleen is dat waarschijnlijk niet mogelijk met de PHP crc funties. Dan moet ik weer een eigen CRC functie gaan schrijven..

Trouwens, dat gzippen kost best nog wel wat performance! Misschien niet als je een aanroepje per minuut hebt, maar we hebben het hier over een applicatie met 15 miljoen aanroepen per dag (in de piek is dit zo'n 400 aanroepen per seconde). Dan is gzip toch best wel een heftig proces en is elke milliseconde kostbaar

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 23 oktober 2002 @ 14:02:
Hi iedereen,
<...knip...>
Alvast bedankt!

Groet,

Robin
Hoi Robin, welkom op het forum! Kun je de volgende keer even het platform in je topicsubject zetten, in dit geval [PHP] Chunked gzip compressie, en daarna even de FAQ doorlezen, zekers met betrekking tot het volgende stukje:
Wij tweakers doen elkaar permanent de groeten. Het is dus niet nodig om steeds ruimteverspillende "greetz [user]" of iets dergelijks onder je posts te plakken. Als je per se zoiets wilt kun je daar je signature voor gebruiken.
No offence verder, gewoon welkom O-)

Professionele website nodig?


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:26
Verwijderd schreef op 23 oktober 2002 @ 15:40:
Aan het eind van een gzip compressed HTML file wordt een 32 bit crc checksum meegestuurd en de lengte van het bestand (ook 32 bit integer).
Oh - dat wist ik niet. Lekker zinloos - je content-length geeft toch al aan hoe groot je bestand is? En een CRC meesturen met data die over TCP wordt verstuurd is ook nogal zinloos.
Nu zou ik de source van de gecachede & gecompressede data moeten inlezen om die crc checksum weer te berekenen. Op zich geen probleem, maar ik vroeg me af of ik die crc ook niet sequential (of incremental, hoe je het ook wil zeggen) kan toepassen.
Als ik het goed herinner moet dat wel kunnen met CRC, alleen is dat waarschijnlijk niet mogelijk met de PHP crc funties. Dan moet ik weer een eigen CRC functie gaan schrijven..
Dat herinner je je goed. CRC(X, "abc") is gelijk aan CRC(CRC(CRC(X, "a"),"b"),"c"); wat X precies is wel op te zoeken (niet 0, maar -1 ofzo geloof ik). In principe kan wat je wil dus wel. Maar ja, als PHP het niet wil, houdt 't op (tenzij je 't zo graag wilt dat je er een PHP module voor schrijft; niet heel erg moeilijk, maar toch wat veel voor zoiets simpels).

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:26
Een eigen CRC functie is trouwens niet zo ingewikkeld, maar als je 'm in PHP schrijft wordt 'ie niet echt snel, vrees ik.

  • DiNo!
  • Registratie: Juni 2000
  • Laatst online: 17:00
Als jij de admin van die server bent, en je gebruikt apache, dan is misschien mod_gzip iets voor je. Deze doet automatisch compressen van bestanden (statisch/dynamisch) als de client-browser dit ondersteund. Misschien heb je er iets aan. Uit ervaring weet ik dat het goed werkt, en het scheelt een hoop programmeerwerk in je scripts. 8)

https://github.com/atoomnetmarc/

Pagina: 1