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
--