[PHP/WML] Paginagrootte onder controle houden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bij het maken van een WAP-pagina is er het grote probleem van de paginagrootte. Door de kleine geheugens in telefoons kan een gecompileerde pagina niet meer dan een x aantal bytes bevatten.

Het aantal x is hierbij per telefoon anders. Het is echter wel mogelijk om het type telefoon op te vragen, dus met een leuke tabelletje kan je daar nog wel rekening mee houden.

Echter, je weet niet (precies) hoe het compileren van de pagina zal verlopen. De grootte van de uiteindelijke pagina blijft dus een vraagteken.

Aangezien mijn WAP pagina wordt gebouwd aan de hand van een hoop info uit een MySQL database weet ik niet precies hoeveel data er in mijn pagina verwerkt moet worden. Ook de complexiteit van de pagina hangt af van de gegevens uit de db.

Heeft iemand enig idee hoe ik kan voorkomen dat de pagina te groot wordt. Alhoewel ik niet denk dat hier een echt passende oplossing voor is....

Maar is er dan iemand die in ieder geval een idee heeft hoe ik de gebruiker een fatsoenlijke melding kan geven dat de pagina niet getoond kan worden?

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:47
Wanneer je output buffering gebruikt, kan PHP voor je bijhouden hoeveel bytes er gegenereerd zijn tot nu toe. Zo kun je dus je pagina genereren en vervolgens kijken of de pagina te groot is. Is dit het geval, dan wis je de buffer stuur je een foutmelding, anders kun je de gebufferde pagina gewoon door sturen.

Een wat nettere oplossing zou misschien zijn om de grootte van je pagina aan te passen als die te groot wordt. Als je bijvoorbeeld een nieuws-pagina hebt, kan ik me voorstellen dat je die op een soortgelijke manier wrapt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ob_start();
for($aantal_berichten = 10; $aantal_berichten > 1; --$aantal_berichten)
{
    /* genereer-nieuws.php maakt gebruik van $aantal_berichten */
    include("genereer-nieuws.php");
    if(ob_get_length() <= 123456)
    {
        /* het past! */
        ob_end_flush();
        exit();
    }

    /* het past niet; wis de te grote buffer */
    ob_clean();
}
ob_end_clean();

print "Helaas, 't past niet!";

Zo geef je dus hooguit 10 nieuwsberichten op een pagina, maar minder als het niet past. Als zelfs 1 bericht niet past (of als je een pagina hebt die niet echt te verkleinen valt) dan geef je een toepasselijke foutmelding.

Ik weet trouwens niet zeker of de lengte van de buffer ook mogelijke HTTP headers bevat. Dat is een kwestie van uitproberen (als het niet in de manual te vinden is). Zo niet, dan moet je een 'veilig' getal van je maximale buffergrootte aftrekken.

[ Voor 11% gewijzigd door Soultaker op 25-11-2002 18:00 ]


Acties:
  • 0 Henk 'm!

  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 03-09 14:12
Misschien dat je iets kan doen met behulp van PEAR::Pager. Daarmee kan je stukken tekst dynamisch opdelen in verschillende pagina's

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wanneer je output buffering gebruikt, kan PHP voor je bijhouden hoeveel bytes er gegenereerd zijn tot nu toe. Zo kun je dus je pagina genereren en vervolgens kijken of de pagina te groot is. Is dit het geval, dan wis je de buffer stuur je een foutmelding, anders kun je de gebufferde pagina gewoon door sturen.
Dat werkt niet omdat de output van het PHP-script pas gecompileerd wordt... En die grootte is bepalend voor de telefoon.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:47
Verwijderd schreef op 25 november 2002 @ 21:02:
Dat werkt niet omdat de output van het PHP-script pas gecompileerd wordt... En die grootte is bepalend voor de telefoon.
Ik begrijp je zinsbouw en je punt niet. :)

De telefoon kijkt toch alleen naar de bytes die 'ie ontvangt? Dat moet toch beperkt blijven? Dat is gelijk aan de hoeveelheid data die PHP buffert om te versturen. Of mis ik iets?

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 22:59

chem

Reist de wereld rond

Soultaker schreef op 25 november 2002 @ 21:07:
[...]

Ik begrijp je zinsbouw en je punt niet. :)

De telefoon kijkt toch alleen naar de bytes die 'ie ontvangt? Dat moet toch beperkt blijven? Dat is gelijk aan de hoeveelheid data die PHP buffert om te versturen. Of mis ik iets?
Nu is WAP al ff geleden voor me, maar *nee*, de output van je HP script is niet gelijk aan wat je wappert ontvangt - de WAP gateway compiled de pagina voor de telefoon nl.

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:47
chem schreef op 25 November 2002 @ 21:10:
Nu is WAP al ff geleden voor me, maar *nee*, de output van je HP script is niet gelijk aan wat je wappert ontvangt - de WAP gateway compiled de pagina voor de telefoon nl.
Oh, dat heb ik nooit geweten. Tja, dan werkt mijn suggestie inderdaad niet. Iets anders proberen? :)

Als je weet hoe de codering werkt, kun je het natuurlijk wel lokaal nadoen op dezelfde manier, maar ja, dat is misschien een hoop werk.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Soultaker schreef op 25 November 2002 @ 21:33:
[...]

Oh, dat heb ik nooit geweten. Tja, dan werkt mijn suggestie inderdaad niet. Iets anders proberen? :)

Als je weet hoe de codering werkt, kun je het natuurlijk wel lokaal nadoen op dezelfde manier, maar ja, dat is misschien een hoop werk.
De output van het PHPscript wordt inderdaad gecompileerd door de gateway. En de complexiteit van het deck kaarten is dus van grote invloed. En juist dat gedeelte is bij mij dynamisch... :(

Om zelf een script te schrijven wat de pagina even compileert en het uitrekent lijkt me ook geen goede actie om nog een beetje een snel script te houden.
Pagina: 1