Beste lezers. Hieronder heb ik een functie waarmee ik modules in mijn systeem laad. De functie leest simpelweg een php-bestand en zet de output d.m.v. een buffer in een variabele. Die variabele word gescand door het systeem waarna er een header en footer aan vastgeplakt word.

<?php
function file_to_var($file)
{
global $db;
if (is_file($file))
{
ob_start();
include($file);
$content = ob_get_contents();
ob_end_clean();
return $content;
}
}
?>

Het bovenstaande werkt helemaal perfect voor mijn systeem. Maar nu: Wanneer ik een module toevoeg met een eigen ob_start() ouputbuffer (zoals bijvoorbeeld de JUploadclass) dan word er vroegtijdig output geproduceerd. Waardoor de output bovenaan de website komt te staan. Situatie:

<?php
function file_to_var($file)
{
global $db;
if (is_file($file))
{
ob_start();
include($file);
//De volgende ob_start() demonstreerd een module met
//een eigen buffer waardoor het systeem vroegtijdig output genereert
ob_start();
$content = ob_get_contents();
ob_end_clean();
return $content;
}
}
?>

Stel a.u.b. geen vragen waarom ik output buffering gebruik om mijn systeem te laten werken. Dit heb ik o.a. gedaan zodat ik bijvoorbeeld zelfgemaakte tags te koppelen aan modules waardoor mensen met geringe ervaring in html al in staat zijn om een eigen layout te maken en modules een plek te geven op de website.
Je kunt het niet zo stapelen, het is net zoals het licht twee keer aanzetten. Aan is aan.
Maar ik krijg het gevoel dat je het vooral gebruikt om de info uit het bestand in te laden. Is het dan niet handiger om bijvoorbeeld file_get_contents te gebruiken?
@tjvb dat is niet waar. Je kan output buffers prima stacken. Worden gewoon netjes verwerkt zoals verwacht.

Wat me vooral opvalt is dat je in het 2e script 2x ob_start heb en maar 1x de output leeg maakt. Ik zou daar gaan zoeken. Sommige scripts zijn erg makkelijk met het sluiten van output buffers omdat 'php ze toch al sluit' zolang je er maar 1 gebruikt is dat niet zo erg maar gebruik er meerdere en je komt in de knoop.
Volgens mij is het bij JUpload zo dat ze opzettelijk alle buffers sluiten omdat ze willen communiceren met hun applet zonder troep in de output, en op die manier alle andere output kunnen blokkeren.

Tegen de situatie die jij beschrijft zou je misschien kunnen werken door een eigen output callbsck functie mee te geven aan ob_start(), welke wanneer hij aangeroepen wordt een variabele op n zet. Vervolgens kan je net zo vaak ob_end_clean aanroepen totdat je variabele op n staat, want dan weet je zeker dat je alle buffers die daarbinnen zaten ook gesloten hebt.
@Johan Dam
Het klopt idd wat jij zegt. Die 2 keer ob_start heb ik zo neergezet om te simuleren hoe in de Jupload class die ob_start nog een keer word aangeroepen. JUpload gebruikt die buffer om de <!--JUpload applet --> tag om te zetten in de output van de applet.

@Jelmer
Zou je een klein voorbeeldje kunnen geven? Bedoel je dit ongeveer? maar hoe nu verder? Er mist sowiezo nog iets aan. Iets van een if/else statement ofzo, maar wat. Ik kan gewoon geen voorbeelden vinden voor deze situatie, en als ze er zijn dan denk ik dat ik het principe van ob_start niet goed begrijp.
<?php
function callback()
{
return 'test';
}
function file_to_var($file)
{
global $db;
if (is_file($file))
{
//refereer naar callback functie
ob_start('callback');
include($file);
//2e buffer
ob_start();
//wis 2e buffer
ob_end_clean();
//haal content op van 1e buffer
$content = ob_get_contents();
//wis 1e buffer
ob_end_clean();
return $content;
}
}
?>

Bedankt in ieder geval voor de reacties

Reageren