vraag over ob_start() en session_start()

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

J opla

j opla

06/02/2016 20:56:24
Quote Anchor link
Beste mensen,

Ik heb een vraagje op de functies ob_start() en session_start(). Ik heb begrepen dat deze aan het begin van een script moeten staan. Maar moeten ze echt als allereerste staan, of moeten ze voor er enige "html" output wordt gebruikt staan.

Dat wil zeggen: in heb een bestand index.php, daarin wil ik alleen "
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php require algemeen.php"; ?>
in zetten en dan algemeen.php starten met:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php ob_start(); session_start(); ... etc ... ?>


Gaat dat werken?

Dank voor een reactie,

J.
Gewijzigd op 06/02/2016 21:11:15 door J opla
 
PHP hulp

PHP hulp

24/11/2024 07:37:24
 
Ben van Velzen

Ben van Velzen

06/02/2016 21:09:47
Quote Anchor link
Ja, dat gaat werken, maar waarom zou je ob_start() gebruiken?
 
J opla

j opla

06/02/2016 21:14:02
Quote Anchor link
Beste Ben,

Dank je voor je reactie. Ik had die ob_start ergens voor nodig omdat anders iets ergens niet werkte ... vaag hè ... maar het precieze hoe en waarom kan ik me niet meer herinneren. ... Waarschijnlijk om de output buffering aan te zetten:

"This function will turn output buffering on. While output buffering is active no output is sent from the script (other than headers), instead the output is stored in an internal buffer. "
 
Ben van Velzen

Ben van Velzen

06/02/2016 21:18:41
Quote Anchor link
Dus moet je dat probleem in je script gaan oplossen, en niet ob_start gebruiken om je fout te verdoezelen. Vermoedelijk gewoon een "headers already sent" melding, welke toch vrij duidelijk lijkt.
 
J opla

j opla

06/02/2016 21:24:07
Quote Anchor link
Die melding kreeg ik waarschijnlijk ... maar ja, om nu een stuk van andermans script te gaan uitpluizen terwijl die dit als oplossing gebruikt ... Sorrie, ik ben maar een hobbyist ... Maar als je zin hebt ben je natuurlijk altijd welkom ;-)

Maar wel bedankt voor je snelle reactie hoor!
Gewijzigd op 06/02/2016 21:24:32 door j opla
 
Thomas van den Heuvel

Thomas van den Heuvel

06/02/2016 21:31:01
Quote Anchor link
Output buffering heeft zeker zijn nut, zo kun je bijvoorbeeld de uiteindelijke pagina gecomprimeerd (gzip) versturen. Dat scheelt weer (een héle hoop) bandbreedte. Ook kun je snippets HTML of JavaScript op deze manier knippen en op de goede plek plakken of apart bewerken.

Het gebruik van output buffering zou wel een bewuste keuze moeten zijn bijvoorbeeld voor een zekere flexibiliteit in je programma-code. Maar wanneer je dit dan gebruikt zul je een des te grotere discipline moeten hebben bij het programmeren zelf zodat je deze speelruimte niet misbruikt.

Je moet te allen tijde kunnen onderbouwen waarom je iets doet. Als je ob_start() overal maar voorramt als een soort van aanroep van een magische formule ben je verkeerd bezig.
 
J opla

j opla

06/02/2016 21:35:22
Quote Anchor link
@Thomas

Dank je voor je reactie. Even voor mijn begrip: kan het kwaad als het er voor staat?
 
Ivo P

Ivo P

06/02/2016 22:10:14
Quote Anchor link
J opla op 06/02/2016 20:56:24:
Ik heb begrepen dat deze aan het begin van een script moeten staan. Maar moeten ze echt als allereerste staan, of moeten ze voor er enige "html" output wordt gebruikt staan.


deze functies, maar ook bijvoorbeeld header() en set_cookie() moeten staan op een plek waar nog geen output naar de client is gestuurd.

Want als er een byte aan data naar de client /browser gestuurd wordt, dan moet dat vooraf gegaan worden door http-headers.
Zeg maar een stukje info om te vertellen wat er aan komt.

Bijvoorbeeld: he browser, hiet heb je zodadelijk 165kB aan data.Dat gaat binaire zooi zijn en je moet het zien als een plaatje (jpeg). En waarschijnlijk blijft dit plaatje de komende 48 uur onveranderd, dus als je hem dadelijk weer nodig hebt, gebruik dan deze maar weer".

Maar het kan ook om html data gaan, en info over cookies bevatten etc. etc.

Zou je nu na deze headers en de eerste data op regel 300 van je script nog ontdekken dat je ook niet iets wilde zeggen over een extra header tbv een redirect of zo, dan ben je te laat. De headers zijn al verstuurd en op basis van die info is de browser al bezig een pagina op te bouwen.

Maar zo lang je nog geen headers verstuurd hebt, kun je ook op regel 1000 nog session start ztten
 
J opla

j opla

06/02/2016 22:15:49
Quote Anchor link
@Ivo
Dank je, dat vermoedde ik al, maar ben blij met je bevestiging.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

06/02/2016 22:17:08
Quote Anchor link
J opla op 06/02/2016 21:35:22:
@Thomas

Dank je voor je reactie. Even voor mijn begrip: kan het kwaad als het er voor staat?


Nee. Je gebruikt enkel meer geheugen op de webserver (voor een kort moment). Alle OUTPUT (statisch en variabel) wordt namelijk eerst gebufferd in het RAM van de server.
En in principe is dat niet nodig als je je script logisch opbouwt. De hoofdregel is dat je in je script begint met PHP waarin je variabelen gereedmaakt die je nodig hebt bij de output. In dit deel komt geen enkele output voor. Daaronder komt dan je "view" . Dit is bij een normale webpagina dus je HTML met daartussen marginale stukjes PHP die enkel als doel hebben om dynamische content te genereren.

Klein voorbeeld:

(eerste deel)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

// initialisatie
$error = '';

if($_SERVER['REQUEST_METHOD'] == 'POST')
{

    if(validation() == TRUE)
    {

        header('Location: thankyou.php');
        exit;
    }


    // set error
    $error = 'Je bent iets vergeten in te vullen.';
}

?>


(tweede deel, de view)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<DOCTYPE!>
<html>
    <head>
        <meta charset="UTF-8">
        <title>My form</title>
    </head>
    <body>
        <div class="warning"><?php echo $error; ?></div>

        <!-- formulier hier -->
    </body>
</html>
 
J opla

j opla

06/02/2016 22:19:46
Quote Anchor link
Dat zou inderdaad erg mooi zijn, om het zo te doen.
 
Thomas van den Heuvel

Thomas van den Heuvel

06/02/2016 23:32:45
Quote Anchor link
Probleem is, soms blijkt pas tijdens de dynamische opbouw van een pagina hoe die pagina er precies uit gaat zien. Daarbij zou een "lager niveau" binnen zo'n pagina van invloed kunnen zijn op de samenstelling van een "hoger niveau" van eenzelfde pagina. Dit zorgt voor wat kip-ei problemen. Een slim gebruik van output buffering kan hier uitkomst bieden. Ik zie ook niet helemaal hoe je hier omheen kunt indien je site een hiërarchische interne opbouw heeft tenzij je alles "vooruit" uitrekent en/of (redundant) opslaat.

Het gebruik van output buffering zou echter geen carte blanche moeten zijn om al je code maar door elkaar te gooien.

"Kan het kwaad" is niet echt een handige vraag. Output buffering is een middel, geen doel. Je slikt toch ook geen paracetamol als je geen hoofdpijn hebt? Je gebruikt het als je het nodig hebt en vermijd het als je het niet nodig hebt. En je moet nogmaals kunnen onderbouwen waarom. En niet "anders valt mijn applicatie uit elkaar" :).

Als je applicatie simpelweg niet werkt als je ob_start() achterwege laat en je weet niet precies waarom dan is dit waarschijnlijk omdat je dingen op de verkeerde plaats hebt staan en niet omdat de architectuur van je applicatie deze flexibiliteit (naar aanleiding van een overwogen en verdedigbaar plan) nodig heeft.
Gewijzigd op 06/02/2016 23:34:24 door Thomas van den Heuvel
 
J opla

j opla

07/02/2016 10:45:00
Quote Anchor link
@Thomas,

Dank voor je reactie. Het probleem zit hem - wat ik me van een paar jaar geleden kan herinneren - in een gastenboek en een contactformulier dat ik heb overgenomen van elders en in mijn pagina heb proberen te integreren. Het is dus een medicijn tegen hoofdpijn en niet omdat ik het zo leuk vond.
 
Yoop Overmaat

Yoop Overmaat

07/02/2016 16:17:31
Quote Anchor link
Ik meen me te herinneren dat een ob_start() en ob_end_flush() gebruikt werden om dat er een gruwelije bug in de begin versie van php5 zat. Je komt het nog wel tegen op de diverse sites. Oplossing errst het php verhaal & daarna het html verhaal.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.