php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #67902 Callback in ob not run
Submitted: 2014-08-25 13:49 UTC Modified: 2014-11-19 09:00 UTC
From: a dot vreugdenhil at amsio dot com Assigned:
Status: Wont fix Package: Output Control
PHP Version: 5.5.16 OS: CentOS
Private report: No CVE-ID: None
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: a dot vreugdenhil at amsio dot com
New email:
PHP Version: OS:

 

 [2014-08-25 13:49 UTC] a dot vreugdenhil at amsio dot com
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.

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2014-11-19 09:00 UTC] mike@php.net
-Status: Open +Status: Wont fix
 [2014-11-19 09:00 UTC] mike@php.net
Chicken and egg problem, sorry, something has to be done first.
 
PHP Copyright © 2001-2020 The PHP Group
All rights reserved.
Last updated: Sun Oct 25 19:01:23 2020 UTC