[PHP] Output buffering vermijden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi,

Ik ben bezig aan een eigen inlogscript.
Omdat ik links en rechts wat sites bouw, wil ik het script in zoveel mogelijk verschillende omgevingen implementeren, zonder al te veel aanpassingen te moeten maken. Ik werk dan ook vaak met includes; zo hou ik de pagina's allemaal lekker uniform.

Nu zit ik hiermee:
1. Ik heb mijn pagina index.php als malletje. Via ?pagina=naam haal ik de verschillende aparte pagina's (met eigenlijke inhoud op).
2. Sommige van die pagina's zijn beveiligd en verifiëren het bestaan van de sessievariabele $_SESSION['rechten']. Bestaat die, ben je binnen.
3. Bestaat die echter niet, dan word je via header("location: index.php?pagina=login"); naar het loginformulier gestuurd.

Het probleem is dat die index.php al lappen code en opmaak bevat, en de headers bijgevolg al lang doorgestuurd worden. Dan krijg je dus die 'Headers already sent'-melding.

Inderdaad, met output buffering los je dat erg gemakkelijk op. Ik vroeg me echter af of het gebruik hiervan in deze context gerectvaardigd is.
Wat denken jullie?

Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 17-09 20:52

ripexx

bibs

Waarom wil je output buffering rechtvaardigen. Voordele van output buffering is bijvoorbeeld dat je de vorige output geheel kan weggooien als er een error optreed en je dan gewoon een nette error pagina an laten zien. Daarnaast kan je later in je script nog cookies en headers versturen. Pas aan het einde flush je de buffer. In ieder geval gebruik ik het bijna altijd.

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Meestal in combinatie met een template engine. Je bouwt je hele pagina door vars te zetten, en uiteindelijk flush je een template erover (ik bouwde dus een .xml file in geheugen, en als alles goed was output je die met bijbehorende xsl)

[ Voor 27% gewijzigd door Zoijar op 27-08-2005 15:32 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Wat Zoijar zegt: niks outputten, en pas onderaan je pagina alles afdrukken, zij het met behulp van templates, zij het door inline HTML code.

Maar ripexx heeft ook gelijk, waarom zou je geen OB toe willen passen?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ripexx schreef op zaterdag 27 augustus 2005 @ 15:28:
Waarom wil je output buffering rechtvaardigen...
Het werd me altijd als een semi-oplossing gebracht. Met een beetje slim programmeren zou je zo'n kermistruukje niet moeten gebruiken.

Zoijar: lijkt me interessant, maar ik snap niet goed wat je precies bedoelt.
Kan je me het iets concreter geven? Alvast bedankt.

Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

offtopic:
Na die header(), zou ik trouwens een die() zetten. Veel mensen denken toch dat dat niet meer hoeft aangezien je visitors redirect, maar als ik 301/302 headers negeer kan ik zonder ingelogt te zijn je hele site bezoeken. Dmv die() voorkom je dat.


Wat zoijar bedoelt is het volgende:

Stel je hebt een template
HTML:
1
2
3
4
5
6
7
8
<html>
<head>
<title>Hoi :w</title>
</head>
<body>
{CONTENT}
</body>
</html>


Jouw PHP script doet vanalles, en aan het einde worden die "variabelen" ({..}) vervangen door de dingen die je weer wilt geven:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?
if ($_SESSION['ingelogd']==FALSE)
{
$template->replaceVar('CONTENT', 'Log eerst eens in');
}
else
{
$template->replaceVar('CONTENT', 'Je bent ingelogd dus je mag deze pagina bezoeken.');
}

$template->echoTemplate();
?>

Je moet dus een templateparser hebben (er zijn er tientallen te vinden op internet), maar zo zorg je wel voor een betere scheiding tussen HTML en PHP, waardoor je geen kunststukjes meer uit hoeft te halen met output buffering.

[ Voor 68% gewijzigd door AtleX op 27-08-2005 16:33 ]

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Niet om deze eeuwenoude discussie alweer op te starten, maar een templateparser is compleet overbodig, PHP is zelf een templateparser. Dit doet exact hetzelfde als AtleX's code:
HTML:
1
2
3
4
5
6
7
8
<html>
  <head>
    <title><?=$title;?></title>
  </head>
  <body>
    <?=$content;?>
  </body>
</html>

PHP:
1
2
3
4
5
6
7
8
9
10
$template['title'] = 'Hoi :w';

if ($_SESSION['ingelogd'] === false) {
  $template['content'] = 'Log eerst eens in';
} else {
  $template['content'] = 'Je bent ingelogd dus je mag deze pagina bezoeken.';
}

extract($template);
include('bovenstaandeHTMLfile.html');


Nogmaals: ik heb geen zin om hier alweer in discussie te treden over het al dan niet gebruiken van een aparte template parser, maar ik probeer wel een eenvoudiger/sneller alternatief aan te wijzen. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Die puntkomma's zijn zelfs overbodig, scheelt weer een beetje 'vervuiling' van je HTML.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

-NMe- schreef op zaterdag 27 augustus 2005 @ 17:40:
HTML:
1
2
3
4
5
6
7
8
<html>
  <head>
    <title><?=$title;?></title>
  </head>
  <body>
    <?=$content;?>
  </body>
</html>
Toch eventjes een kleine offtopic opmerking.
Deze code gaat niet op alle servers/configuraties goed werken ;)
short_open_tag boolean

Tells whether the short form (<? ?>) of PHP's open tag should be allowed. If you want to use PHP in combination with XML, you can disable this option in order to use <?xml ?> inline. Otherwise, you can print it with PHP, for example: <?php echo '<?xml version="1.0"'; ?>. Also if disabled, you must use the long form of the PHP open tag (<?php ?>).

Note: This directive also affects the shorthand <?=, which is identical to <? echo. Use of this shortcut requires short_open_tag to be on.

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

-NMe- schreef op zaterdag 27 augustus 2005 @ 17:40:
Niet om deze eeuwenoude discussie alweer op te starten, maar een templateparser is compleet overbodig, PHP is zelf een templateparser. Dit doet exact hetzelfde als AtleX's code:

...

Nogmaals: ik heb geen zin om hier alweer in discussie te treden over het al dan niet gebruiken van een aparte template parser, maar ik probeer wel een eenvoudiger/sneller alternatief aan te wijzen. :P
Niet dat ik het niet met je eens bent overigens, maar een template engine zoals Smarty heeft 2 (mogelijk) belangrijke voordelen:

1. Indien de gebruikers een derde partij is die je geen PHP mogelijkheden wilt geven kan dat.
2. Of stel dat je een CMS of iets dergelijks hebt intern en je moet programmeurs die er niet zoveel van snappen weerhouden van heel de templates vol met PHP code te zetten :P

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Erkens:
Toch eventjes een kleine offtopic opmerking.
Deze code gaat niet op alle servers/configuraties goed werken ;)
short_open_tag heeft een PERDIR "changeable" flag, en staat default op 1, dus dat lijkt mij nou niet het grootste probleem.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

drm schreef op zaterdag 27 augustus 2005 @ 23:34:
[...]
short_open_tag heeft een PERDIR "changeable" flag, en staat default op 1, dus dat lijkt mij nou niet het grootste probleem.
true, maar het kan alsnog een vervelend probleem zijn/worden als die setting uit staat en je hem niet kan aanpassen omdat je ook ergens werkt met XML (XHTML? ;) )

Acties:
  • 0 Henk 'm!

  • Dutchmega
  • Registratie: September 2001
  • Niet online
Maar over het onderwerp: Ik zie geen reden waarom output-buffering slecht of "vies" is. Het verhoogt je parsetime ook niet merkbaar en dankzij output-buffering heb je veel meer mogelijkheden.

Met een klein scriptje zal je misschien wel rond output-buffering kunnen werken maar als je werkt aan grote CMS'en met meerdere mogelijkheden om gegevens te weergeven, manipuleren en etc. kom je niet ver zonder output-buffering. Daarnaast wil ik ook nog vermelden dat PHP zelf ook buffered en sommige servers ook nog GZIP compressie aanhebben :)
Pagina: 1