Hoofdcategorieën
Topicacties

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

Pagina: 1

Reageer Nieuw Topic
Ik ben er klaar voor!
Berichten: 1.821
Reg. datum: 10 juli 2001

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
<?php
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
<?php
$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?
 
509 Bandwidth Limit Exceeded

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 :)

Portfolio: code92.nl | "Moordnilap nee si jij is een palindroom"

Resistance is futile.
Berichten: 2.161
Reg. datum: 26 november 2002

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

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

All your women are belong to me.

Ik ben er klaar voor!
Berichten: 1.821
Reg. datum: 10 juli 2001

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
<?php
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'?
 
ondergewaardeerde internetguru
Berichten: 6.008
Reg. datum: 30 december 2001

quote:
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).

Johnny wijzigde dit bericht 10-05-2008 21:35 (3%)

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

Ik ben er klaar voor!
Berichten: 1.821
Reg. datum: 10 juli 2001

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
<?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 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?

Gerwin wijzigde dit bericht 10-05-2008 22:07 (170%)

 
Fallen from grace
Berichten: 11.050
Reg. datum: 10 april 2001

Waarom niet gewoon mod_deflate gebruiken?

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

Ik ben er klaar voor!
Berichten: 1.821
Reg. datum: 10 juli 2001

quote:
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. ;)
 
Fallen from grace
Berichten: 11.050
Reg. datum: 10 april 2001

quote:
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?

BOFH @ #Netwerken

quote:
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.

25-09 (3793): OMG! 1337!
26-09 (3150): bericht
28-09 osxy: /me zwaait maar weer eens naar GoT :) :+

SMS "SIG bericht" naar 0622643117

Ik ben er klaar voor!
Berichten: 1.821
Reg. datum: 10 juli 2001

quote:
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.
quote:
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?
 
BOFH @ #Netwerken

quote:
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

25-09 (3793): OMG! 1337!
26-09 (3150): bericht
28-09 osxy: /me zwaait maar weer eens naar GoT :) :+

SMS "SIG bericht" naar 0622643117

getweakt...

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)?

jij ook?

BOFH @ #Netwerken

quote:
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.

25-09 (3793): OMG! 1337!
26-09 (3150): bericht
28-09 osxy: /me zwaait maar weer eens naar GoT :) :+

SMS "SIG bericht" naar 0622643117

getweakt...

quote:
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.

GlowMouse wijzigde dit bericht 11-05-2008 00:37 (15%)

jij ook?

BOFH @ #Netwerken

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.

25-09 (3793): OMG! 1337!
26-09 (3150): bericht
28-09 osxy: /me zwaait maar weer eens naar GoT :) :+

SMS "SIG bericht" naar 0622643117

Fallen from grace
Berichten: 11.050
Reg. datum: 10 april 2001

quote:
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: [view][quote]


Door: Creepy
Moderator PRG/SEA/DTE
Eye Have You
Berichten: 13.126
Reg. datum: 01 juni 2001

quote:
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.....

Creepy wijzigde dit bericht 11-05-2008 10:41 (25%)

- Ik kan niet zingen, geen gitaar spelen en niet drummen.... ik hou het wel bij Rock Band
Juist dan gaan mensen het weer prachtig vinden (Denk aan de josty band *blauw* *blauw* *rood*, *blauw* *blauw* *rood)


Acties: [view][quote]


Door: ACM
Devver / Serveradmin
Werkt hier
Berichten: 33.911
Reg. datum: 20 januari 2000

quote:
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.

[13:34:02] <baa> maar fbsd schijnt nog steeds hopeloos schijnt

getweakt...

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.

jij ook?

Pagina: 1



VNU Media logo Powered by True

© 1998 - 2008 Tweakers.net - Alle rechten voorbehouden

Uitgever van: