[PHP] Statische pagina's pre-gzippen en versturen.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06 20:10

Gerwin

Ik ben er klaar voor!

Topicstarter
Op dit moment ben ik bezig om te proberen om html bestandjes op de server standaard als gzip te versturen naar de browser van de bezoeker. Echter wil ik dit niet 'on te fly' doen maar middels bijvoorbeeld htaccess of php eerst kijken of de bezoeker gzip ondersteund om vervolgens een bestaand gzip bestandje naar de bezoeker te sturen. Als de bezoeker geen gzip ondersteund dan stuur ik een standaard niet gecomprimeerd bestandje.

In mijn code komt onderstaande code voor.

PHP:
1
2
3
4
5
6
7
8
9
10
if (!empty($_SERVER["HTTP_ACCEPT_ENCODING"]) &&
strpos($_SERVER["HTTP_ACCEPT_ENCODING"], 'gzip') !== false)
{
header("Content-Encoding: gzip");
readfile('/cache/bestandje.html.gz');
}
else
{
readfile('/cache/bestandje.html');
}


De gzip maak ik zo aan waarbij de content $data is.

PHP:
1
2
3
4
$tname = '/cache/bestandje.html.gz';
$gz = gzopen($tname,'w9');
gzwrite($gz, $data);
gzclose($gz);

gzwrite($gz, $data);
[/code]

Echter krijg ik als in elk geval als ik de pagina open in firefox een compleet lege pagina. Ook 'error_reporting(E_ALL)' geeft geen enkele info. Wat gaat hier mis, zie ik iets over het hoofd, ben ik iets vergeten?

Station van Gerwin Prins op Apple Music


Acties:
  • 0 Henk 'm!

  • WeeJeWel
  • Registratie: April 2007
  • Laatst online: 10-09 21:35
strpos($_SERVER["HTTP_ACCEPT_ENCODING"], 'gzip')

is niet niet waar? volgens mij kun je daar gewoon if(strpos($_SERVER["HTTP_ACCEPT_ENCODING"], 'gzip')) van maken :)

Homey — Critics are those without skills to create.


Acties:
  • 0 Henk 'm!

  • TheBorg
  • Registratie: November 2002
  • Laatst online: 20-09 18:24

TheBorg

Resistance is futile.

Stuur ook eens deze header mee:
Vary: Accept-Encoding

En wat is er mis met:
ob_start("ob_gzhandler");

Acties:
  • 0 Henk 'm!

  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06 20:10

Gerwin

Ik ben er klaar voor!

Topicstarter
Ik heb nu de volgende code, maar krijg een lege pagina, zonder foutmeldingen of waarschuwingen. De reden dat ik geen obgzhandler gebruikt is dat ik dit eens wilde proberen zonder de server telkens maar weer veel kracht te laten gebruiken hetzelfde bestandje te gzippen. Dit gzippen kan eigenlijk ook in datzelfde cache bestandje gecached worden.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
error_reporting(E_ALL);

if (strpos($_SERVER["HTTP_ACCEPT_ENCODING"], 'gzip') !== false)
{
header("Content-Encoding: gzip");
header('Vary: Accept-Encoding');
readfile('/cache/653c713651be45cebc86f71323cc83df.html.gz');
}
else
{
readfile('/cache/653c713651be45cebc86f71323cc83df.html');
}


Allebei heel erg bedankt voor het antwoord tot nu toe. Maar wat gaat er mis hier, of hoe kan ik dit 'debuggen'?

Station van Gerwin Prins op Apple Music


Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 21-09 14:39

Johnny

ondergewaardeerde internetguru

WeeJeWel schreef op zaterdag 10 mei 2008 @ 21:21:
strpos($_SERVER["HTTP_ACCEPT_ENCODING"], 'gzip')

is niet niet waar? volgens mij kun je daar gewoon if(strpos($_SERVER["HTTP_ACCEPT_ENCODING"], 'gzip')) van maken :)
Nee, de strpos() functie van PHP geeft een 0 terug de string begint met 'gzip' wat dus omgezet wordt naar false, wat je hier niet wil. Met !== (dubbel is-teken) zeg je dat het echt een false (boolean) moet zijn en niet 0 (integer).

[ Voor 3% gewijzigd door Johnny op 10-05-2008 21:35 ]

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06 20:10

Gerwin

Ik ben er klaar voor!

Topicstarter
Heb ik een nieuwe code (stukje van http://nl.php.net/strpos).

Met de volgende code blijft de pagina leeg:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    $data = '<br>Dit is een stukje tekst<br>';
    
    $gz = gzopen('./cache/test.html.gz','w9');
    gzwrite($gz, $data);
    gzclose($gz); 
    
    error_reporting(E_ALL);
    
    $mystring = $_SERVER['HTTP_ACCEPT_ENCODING'];
    $findme = 'gzip';
    $pos = strpos($mystring, $findme);
    
    if ($pos === false)
    {
        echo 'Geen compressie';
        // readfile('/cache/test.html');
    }
    else
    {
        // echo 'Wel compressie';
        header("Content-Encoding: gzip");
        header('Vary: Accept-Encoding');
        readfile('./cache/test.html.gz');
    }

Ik krijg wel 'Wel compressie' en rommel terug met volgende code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php

    $data = '<br>Dit is een stukje tekst<br>';
    
    $gz = gzopen('./cache/test.html.gz','w9');
    gzwrite($gz, $data);
    gzclose($gz); 
    
    error_reporting(E_ALL);
    
    $mystring = $_SERVER['HTTP_ACCEPT_ENCODING'];
    $findme = 'gzip';
    $pos = strpos($mystring, $findme);
    
    if ($pos === false)
    {
        echo 'Geen compressie';
        // readfile('/cache/test.html');
    }
    else
    {
        echo 'Wel compressie';
        // header("Content-Encoding: gzip");
        // header('Vary: Accept-Encoding');
        readfile('./cache/test.html.gz');
    }

?>


Ik heb de goede headers toch wel te pakken? Waarom krijg ik geen foutmelding?

[ Voor 170% gewijzigd door Gerwin op 10-05-2008 22:07 ]

Station van Gerwin Prins op Apple Music


Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Waarom niet gewoon mod_deflate gebruiken?

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06 20:10

Gerwin

Ik ben er klaar voor!

Topicstarter
Confusion schreef op zaterdag 10 mei 2008 @ 22:36:
Waarom niet gewoon mod_deflate gebruiken?
Zoals ik eerder gepost heb wil ik een mogelijkheid proberen om php bestanden die maar eens in de zoveel tijd veranderen direct al gezipped in de cache hebben zodat bij elke bezoeker niet de hele pagina opnieuw gezipped en verstuurd hoeft te worden. mod_gzip of deflate heb ik nu al aanstaan, maar dat kost tot 40% van de servercapaciteit. Waarom die capaciteit inleveren als het ook beter kan?

Daarbij komt dat ik eigenlijk nu ook wel wil weten wat er nu mis is en waarom het niet werkt. ;)

Station van Gerwin Prins op Apple Music


Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Gerwin schreef op zaterdag 10 mei 2008 @ 22:40:
mod_gzip of deflate heb ik nu al aanstaan, maar dat kost tot 40% van de servercapaciteit. Waarom die capaciteit inleveren als het ook beter kan?
Waarom zelf een oplossing schrijven als er allang oplossingen bestaan? Als php bestanden maar eens in de zoveel tijd wijzigen, dan kan je de .html eenmalig genereren na wijziging Caching van de gegzipte versie daarvan is op vele manieren te regelen, zonder dat je zelf opnieuw in alle valkuilen kan trappen.

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Gerwin schreef op zaterdag 10 mei 2008 @ 21:41:
Heb ik een nieuwe code (stukje van http://nl.php.net/strpos).

Met de volgende code blijft de pagina leeg:

<knip>

Ik krijg wel 'Wel compressie' en rommel terug met volgende code:

<knip>

Ik heb de goede headers toch wel te pakken? Waarom krijg ik geen foutmelding?
Komt het niet gewoon doordat hij die headers niet kan plaatsen? Check je error log file eens, het is namelijk mogelijk om bij dergelijke warnings je script gewoon af te laten breken, iets wat vaak gedaan wordt in productie omgevingen, waarbij uiteraard ook de error melding niet in je output komt.

Acties:
  • 0 Henk 'm!

  • Gerwin
  • Registratie: Juli 2001
  • Laatst online: 08-06 20:10

Gerwin

Ik ben er klaar voor!

Topicstarter
Confusion schreef op zaterdag 10 mei 2008 @ 23:02:
[...]

Waarom zelf een oplossing schrijven als er allang oplossingen bestaan? Als php bestanden maar eens in de zoveel tijd wijzigen, dan kan je de .html eenmalig genereren na wijziging Caching van de gegzipte versie daarvan is op vele manieren te regelen, zonder dat je zelf opnieuw in alle valkuilen kan trappen.
Zoals altijd gaan er meerdere wegen naar Rome. Wat het doel is om er vanaf te zijn dat elke keer hetzelfde bestandje gezipped moet worden. Html bestandjes genereren is nummer 1, maar ik genereer daarnaast ook de .gz van deze html bestandjes en wil dan òf middels php òf middels een htaccess rewrite het juiste bestandje sturen naar de bezoeker. Ik kijk op dit moment naar de php versie, via .htaccess is ook een optie.
Erkens schreef op zaterdag 10 mei 2008 @ 23:11:
[...]

Komt het niet gewoon doordat hij die headers niet kan plaatsen? Check je error log file eens, het is namelijk mogelijk om bij dergelijke warnings je script gewoon af te laten breken, iets wat vaak gedaan wordt in productie omgevingen, waarbij uiteraard ook de error melding niet in je output komt.
Ik zie geen errorlogs op het domain, dat is ook één van de eerste dingen die ik gedaan heb.

Rara, wat gaat er fout, is met zekerheid te zeggen dat de code wel juist is?

Station van Gerwin Prins op Apple Music


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Confusion schreef op zaterdag 10 mei 2008 @ 22:36:
Waarom niet gewoon mod_deflate gebruiken?
mod_deflate zal voor elke request weer gaan gzippen, iets wat een beetje nutteloos CPU verbruik is imo. Wat beter zal zijn is om dmv mod_negotiation de reeds gemaakte static files te leveren. Dus dan krijg je files als: static_file.html.gz

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Heb je al eens met een sniffer gekeken wat er precies gebeurt? En weet je zeker dat mod_deflate nu niet een tweede keer compressie toepast (hoewel je dan een pagina met gekke tekens zou verwachten ipv een lege pagina)?

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

GlowMouse schreef op zaterdag 10 mei 2008 @ 23:40:
Heb je al eens met een sniffer gekeken wat er precies gebeurt? En weet je zeker dat mod_deflate nu niet een tweede keer compressie toepast (hoewel je dan een pagina met gekke tekens zou verwachten ipv een lege pagina)?
mod_deflate doet niks met "dynamische" pagina's zoals PHP of CGI, alleen met files die rechtstreeks door apache worden doorgegeven.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Erkens schreef op zondag 11 mei 2008 @ 00:07:
[...]

mod_deflate doet niks met "dynamische" pagina's zoals PHP of CGI, alleen met files die rechtstreeks door apache worden doorgegeven.
Gek, hier wel (en dat gebeurt niet door php, geen outputbuffer en zlib.output_compression = Off). Ook bij dit voorbeeld (onder 3. Testing) zie je dat een .php-file gecomprimeerd wordt.

TS: hier werkt de code probleemloos. Heb het op twee servers getest (een draait Apache + mod_deflate en een minder generieke webserver), en geen van beide gaf een probleem.

[ Voor 15% gewijzigd door GlowMouse op 11-05-2008 00:37 ]


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

hmm, dat is anders dan ik me herinnerde.
In ieder geval vind ik dat gedrag ongewenst en zou ik als ik dus mod_deflate wil gebruiken dergelijke request excluden. Want hierdoor kan het dus inderdaad gebeuren dat de pagina 2x gezipped wordt bijvoorbeeld met PHP door de ini setting 'zlib.output_compression' of door ob_gzhandler.

Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Erkens schreef op zaterdag 10 mei 2008 @ 23:34:
[...]
mod_deflate zal voor elke request weer gaan gzippen, iets wat een beetje nutteloos CPU verbruik is imo.
Elegant is het niet, maar wel effectief. Als je toch cycles 'over' hebt, dan is het veruit de makkelijkste oplossing. Ik ken een aantal productiesystemen waar zonder problemen mod_deflate aangezet zou kunnen worden.

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

Gerwin schreef op zaterdag 10 mei 2008 @ 21:41:
Ik krijg wel 'Wel compressie' en rommel terug met volgende code:

PHP:
1
2
<?php
?>
Die "rommel" die je krijgt is zeer waarschijnlijk je gzip bestand. Aangezien je voordat je het gzip bestand teruggeeft al plain text "wel compressie" teruggeeft krijg je die rommel te zien;. Je moet natuurlijk niet extra zaken gaan echo'en als het complete gzip bestand al alle informatie bevat.

Los daarvan: waarom dit in hemelsnaam? Heb je nu al zoveel load dat een optie zoals dit echt nodig is? Of denk je echt dat dit een probleem gaat worden? Het gzippen van een html bestand kost zoveel kracht nu ook weer niet en je bent nu voor elk plain html bestand een PHP scripy aan het zetten dat ook weer extra kracht kost.....

[ Voor 25% gewijzigd door Creepy op 11-05-2008 10:41 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Creepy schreef op zondag 11 mei 2008 @ 10:39:
Los daarvan: waarom dit in hemelsnaam? Heb je nu al zoveel load dat een optie zoals dit echt nodig is? Of denk je echt dat dit een probleem gaat worden? Het gzippen van een html bestand kost zoveel kracht nu ook weer niet en je bent nu voor elk plain html bestand een PHP scripy aan het zetten dat ook weer extra kracht kost.....
Sterker nog, de overhead van php zou wel eens het grootste deel van de winst van de bespaarde mod_deflate calls te niet kunnen doen.

Je kan wellicht beter kijken of het mogelijk is om ofwel mod_negotation te gebruiken ofwel of de output van mod_deflate in de caches van mod_cache terecht kan komen.
Een alternatief is in ieder geval lighttpd, die met zijn mod_compress/mod_deflate standaard al ondersteuning heeft om de gecompresste data te cachen.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Maar als het met PHP eenmaal werkt, is het ook zo via mod_rewrite geregeld. Een voorbeeldje daarvan is te vinden in de .htaccess van SuperCache.
Pagina: 1