[PHP] Output buffering en register_shutdown_function()

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Ik probeer een zo eenvoudig mogelijk cache systeem te maken. Hiervoor wil ik dat er maar één regel hoeft te worden aangeroepen, en verder niets. Hierom wil ik register_shutdown_function() gebruiken om, als dat nodig is, de totale output op te slaan in een file.

Ik heb de code voor dit probleem gereduceerd:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class a
{
        function start()
        {
                ob_start();
                register_shutdown_function(array('a','getcontents'));
        }
        function getcontents()
        {
                if (ob_get_contents() !== false)
                {
                        echo 'Er is wel een buffer!';
                }
                else
                {
                        echo 'Er is geen buffer!';
                }
        }
}

a::start();
echo date('r');

Geeft bij mij de output:
code:
1
Tue, 12 Oct 2004 10:51:58 +0200Er is geen buffer!

Terwijl er in a::start() wel degelijk een output buffer gestart wordt. Wanneer ik a::getcontents() aan het eind aanroep in plaats van via register_shutdown_function(), dan werkt het wel.

Wat doe ik verkeerd / hoe krijg ik het toch aan de praat met register_shutdown_function()?

Acties:
  • 0 Henk 'm!

  • ludo
  • Registratie: Oktober 2000
  • Laatst online: 26-04-2024
Uit de manual:
The registered shutdown functions are called after the request has been completed (including sending any output buffers), so it is not possible to send output to the browser using echo() or print(), or retrieve the contents of any output buffers using ob_get_contents().
ob_get_contents zal dus altijd false opleveren als je hem aanroept in een register_shutdown_function :)

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
|:( Ah, dat is dus behavior by design. Maar eens kijken of het ook anders kan.