Bug #67902 [NEW]: Callback in ob not run

From: Date: Mon, 25 Aug 2014 13:49:04 +0000
Subject: Bug #67902 [NEW]: Callback in ob not run
Groups: php.bugs 
Request: Send a blank email to php-bugs+get-187268@lists.php.net to get a copy of this message
From:             a dot vreugdenhil at amsio dot com
Operating system: CentOS
PHP version:      5.5.16
Package:          Output Control
Bug Type:         Bug
Bug description:Callback in ob not run

Description:
------------
Some (dirty) legacy code broke when upgrading to php 5.5.* from 5.3.*.
We pinpointed the problem to this:

Aparrently garbage collection removes stuff from the $GLOBALS
superglobal before any open output buffers are being flushed.

Prerequisites for the issue to occur:
1) using ob_start with a callback, and having it unended at the end of
the script
2) the callback uses an object that's only referenced in the superglobal
$GLOBALS

Apparently PHP removes the object earlier if it's only reference is in
the $GLOBALS. If not, nothing's wrong.

I know prettier code would never have encountered this problem, but
since working old code stopped working I'd call it a backwards
incompatibility at the least.


Test script:
---------------
<?php

class test{
	public $instance = null;
	public $test = 'Hi, I\'m test';
}

$GLOBALS['test'] = new test();

function little_callback( $buffer ){
	return $GLOBALS['test']->test;
} 

ob_start( 'little_callback' );

echo "hello I'm in the buffer. You'll never see me because the callback
replaces me.";

// Enable this to make it work by creating a reference to the object
// $GLOBALS['test']->instance = $GLOBALS['test'];

// Enable this to make it work by flushing before the script ends so
garbage collection doesn't beat the output buffer to it
// ob_end_flush
?>

Expected result:
----------------
Hi, I'm test

Actual result:
--------------
Empty page.

-- 
Edit bug report at https://bugs.php.net/bug.php?id=67902&edit=1
-- 



Thread (2 messages)

« previous php.bugs (#187268) next »