|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
[2014-11-19 09:00 UTC] mike@php.net
-Status: Open
+Status: Wont fix
[2014-11-19 09:00 UTC] mike@php.net
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Oct 25 01:00:01 2025 UTC |
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.