From: Camilo Sperberg on 13 Sep 2010 18:16 I have some really strange behaviour going on here, and I think it could be a (minor) PHP's bug. I am not really sure about what happens internally, but my best guess would be that after a memory exhaustion, when I try to execute a custom error handler with the register_shutdown_function (which is executed even after a fatal error) and try to access the element that provoked the memory exhaustion, no error should raise instead of *Uninitialized string offset: 0. I have prepared a little test case to reproduce the error and (I hope) can explain the error. <?php date_default_timezone_set('America/Santiago'); ini_set('memory_limit','1M'); ini_set('display_errors',1); error_reporting(-1); function my_error_handler($errno = '0', $errstr = '[FATAL] General Error', $errfile = 'N/A', $errline = 'N/A', $errctx = '') { global $clean_exit; if(empty($clean_exit)) { ini_set('memory_limit','16M'); ob_start(); echo '<h1>PHP v'.PHP_VERSION.', error N° '.$errno.'</h1>'; ?><h4>-- BEGIN COPY --</h4><p style="font-size:110%;margin:50px 0 20px 25px"><em>Error N°:</em><br /><?php echo '<strong>'.$errno.'</strong><br />'; ?><em>Error Detail:</em><br /><?php echo '<strong>'.$errstr.'</strong><br /><em>File:</em><br /><strong>'.$errfile.'</strong><br /><em>Line:</em><br /><strong>'.$errline.'</strong><br /><em>Debug:</em><br />'; if (isset($errctx['r']['print'])) echo '<p>THIS LINE GIVES THE ERROR, WHAT SHOULD IT RETURN?</p>'; ?></p><h4>-- END COPY --</h4><?php $content = ob_get_contents(); ob_end_clean(); die($content); } } set_error_handler('my_error_handler'); register_shutdown_function('my_error_handler'); for ($i = 0; $i < 10000; $i++) $a[$i] = mt_rand(1,254); $r['print'] = print_r($a,TRUE); echo '<p>Everything fine.</p>'; $clean_exit = TRUE; * Would this be a bug or is this expected behaviour? I have tested this on PHP v5.2.14, I've not tested it yet on 5.3.3, but I guess it would have the same behaviour. Greetings! -- Mailed by: UnReAl4U - unreal4u ICQ #: 54472056 www1: http://www.chw.net/ www2: http://unreal4u.com/
From: Tamara Temple on 13 Sep 2010 18:56 This isn't to answer your question, but... On Sep 13, 2010, at 5:16 PM, Camilo Sperberg wrote: > function my_error_handler($errno = '0', $errstr = '[FATAL] General > Error', > $errfile = 'N/A', $errline = 'N/A', $errctx = '') { > global $clean_exit; > if(empty($clean_exit)) { > ini_set('memory_limit','16M'); > ob_start(); > echo '<h1>PHP v'.PHP_VERSION.', error N° '.$errno.'</h1>'; > ?><h4>-- BEGIN COPY --</h4><p style="font-size:110%;margin:50px 0 20px > 25px"><em>Error N°:</em><br /><?php > echo '<strong>'.$errno.'</strong><br />'; > ?><em>Error Detail:</em><br /><?php > echo '<strong>'.$errstr.'</strong><br /><em>File:</em><br > /><strong>'.$errfile.'</strong><br /><em>Line:</em><br > /><strong>'.$errline.'</strong><br /><em>Debug:</em><br />'; > if (isset($errctx['r']['print'])) echo '<p>THIS LINE GIVES THE > ERROR, > WHAT SHOULD IT RETURN?</p>'; > ?></p><h4>-- END COPY --</h4><?php > $content = ob_get_contents(); > ob_end_clean(); > die($content); > } > } Why do you put <?php echo...?> inside an echo statement in php space?
From: Camilo Sperberg on 14 Sep 2010 00:51 On Mon, Sep 13, 2010 at 18:56, Tamara Temple <tamouse.lists(a)gmail.com>wrote: > This isn't to answer your question, but... > > > On Sep 13, 2010, at 5:16 PM, Camilo Sperberg wrote: > >> function my_error_handler($errno = '0', $errstr = '[FATAL] General Error', >> $errfile = 'N/A', $errline = 'N/A', $errctx = '') { >> global $clean_exit; >> if(empty($clean_exit)) { >> ini_set('memory_limit','16M'); >> ob_start(); >> echo '<h1>PHP v'.PHP_VERSION.', error N° '.$errno.'</h1>'; >> ?><h4>-- BEGIN COPY --</h4><p style="font-size:110%;margin:50px 0 20px >> 25px"><em>Error N°:</em><br /><?php >> echo '<strong>'.$errno.'</strong><br />'; >> ?><em>Error Detail:</em><br /><?php >> echo '<strong>'.$errstr.'</strong><br /><em>File:</em><br >> /><strong>'.$errfile.'</strong><br /><em>Line:</em><br >> /><strong>'.$errline.'</strong><br /><em>Debug:</em><br />'; >> if (isset($errctx['r']['print'])) echo '<p>THIS LINE GIVES THE ERROR, >> WHAT SHOULD IT RETURN?</p>'; >> ?></p><h4>-- END COPY --</h4><?php >> $content = ob_get_contents(); >> ob_end_clean(); >> die($content); >> } >> } >> > > Why do you put <?php echo...?> inside an echo statement in php space? > > I think you may have mis-readed the code, I can't find where I put an <?php echo inside an echo. I do a lot of opening/closing tags which contributes to messing things up estetically but it works... Any way, the posted code had a lot of remniscants of the production code, here is a simplified version which does the same as above but .. well, simplified :P <?php date_default_timezone_set('America/Santiago'); ini_set('memory_limit','1M'); ini_set('display_errors',1); error_reporting(-1); function my_error_handler($errno = '0', $errstr = '[FATAL] General Error', $errfile = 'N/A', $errline = 'N/A', $errctx = '') { global $clean_exit; if(empty($clean_exit)) { // if isset or !empty, the script would have been exited cleanly. ini_set('memory_limit','16M'); // This would be just to have enough memory to print out the error. echo '<h5>-- BEGIN ERROR --</h5>Error N°: <strong>'.$errno.'</strong><br />Error Description: <strong>'.$errstr.'</strong><br />File: <strong>'.$errfile.'</strong><br />Line: <strong>'.$errline.'</strong>'; if (isset($errctx['r']['print'])) echo '<p>THIS LINE GIVES THE ERROR, WHAT SHOULD IT RETURN?</p>'; // isset or empty gives the same error echo '<h5>-- END ERROR --</h5>'; die(); // shutdown_function == manual die() or else it will continue to execute. } } set_error_handler('my_error_handler'); register_shutdown_function('my_error_handler'); for ($i = 0; $i < 15000; $i++) $a[$i] = mt_rand(1,255); $r['print'] = (string)$a[1]; // Just to asign something to that variable. echo '<p>Everything fine.</p>'; $clean_exit = TRUE; Greetings :) -- Mailed by: UnReAl4U - unreal4u ICQ #: 54472056 www1: http://www.chw.net/ www2: http://unreal4u.com/
From: Camilo Sperberg on 14 Sep 2010 02:02 Well, after some more testing I'm almost sure it is some kind of strange minor bug... so I've submitted a bug report: http://bugs.php.net/bug.php?id=52833 Greetings ! On Tue, Sep 14, 2010 at 00:51, Camilo Sperberg <unreal4u(a)gmail.com> wrote: > > On Mon, Sep 13, 2010 at 18:56, Tamara Temple <tamouse.lists(a)gmail.com>wrote: > >> This isn't to answer your question, but... >> >> >> On Sep 13, 2010, at 5:16 PM, Camilo Sperberg wrote: >> >>> function my_error_handler($errno = '0', $errstr = '[FATAL] General >>> Error', >>> $errfile = 'N/A', $errline = 'N/A', $errctx = '') { >>> global $clean_exit; >>> if(empty($clean_exit)) { >>> ini_set('memory_limit','16M'); >>> ob_start(); >>> echo '<h1>PHP v'.PHP_VERSION.', error N° '.$errno.'</h1>'; >>> ?><h4>-- BEGIN COPY --</h4><p style="font-size:110%;margin:50px 0 20px >>> 25px"><em>Error N°:</em><br /><?php >>> echo '<strong>'.$errno.'</strong><br />'; >>> ?><em>Error Detail:</em><br /><?php >>> echo '<strong>'.$errstr.'</strong><br /><em>File:</em><br >>> /><strong>'.$errfile.'</strong><br /><em>Line:</em><br >>> /><strong>'.$errline.'</strong><br /><em>Debug:</em><br />'; >>> if (isset($errctx['r']['print'])) echo '<p>THIS LINE GIVES THE ERROR, >>> WHAT SHOULD IT RETURN?</p>'; >>> ?></p><h4>-- END COPY --</h4><?php >>> $content = ob_get_contents(); >>> ob_end_clean(); >>> die($content); >>> } >>> } >>> >> >> Why do you put <?php echo...?> inside an echo statement in php space? >> >> > > I think you may have mis-readed the code, I can't find where I put an <?php > echo inside an echo. I do a lot of opening/closing tags which contributes to > messing things up estetically but it works... > > Any way, the posted code had a lot of remniscants of the production code, > here is a simplified version which does the same as above but .. well, > simplified :P > > <?php > date_default_timezone_set('America/Santiago'); > ini_set('memory_limit','1M'); > ini_set('display_errors',1); > error_reporting(-1); > > function my_error_handler($errno = '0', $errstr = '[FATAL] General Error', > $errfile = 'N/A', $errline = 'N/A', $errctx = '') { > global $clean_exit; > if(empty($clean_exit)) { // if isset or !empty, the script would have > been exited cleanly. > ini_set('memory_limit','16M'); // This would be just to have enough > memory to print out the error. > echo '<h5>-- BEGIN ERROR --</h5>Error N°: > <strong>'.$errno.'</strong><br />Error Description: > <strong>'.$errstr.'</strong><br />File: <strong>'.$errfile.'</strong><br > />Line: <strong>'.$errline.'</strong>'; > if (isset($errctx['r']['print'])) echo '<p>THIS LINE GIVES THE ERROR, > WHAT SHOULD IT RETURN?</p>'; // isset or empty gives the same error > echo '<h5>-- END ERROR --</h5>'; > die(); // shutdown_function == manual die() or else it will continue to > execute. > > } > } > set_error_handler('my_error_handler'); > register_shutdown_function('my_error_handler'); > > for ($i = 0; $i < 15000; $i++) $a[$i] = mt_rand(1,255); > $r['print'] = (string)$a[1]; // Just to asign something to that variable. > > echo '<p>Everything fine.</p>'; > $clean_exit = TRUE; > > > Greetings :) > > -- > Mailed by: > UnReAl4U - unreal4u > ICQ #: 54472056 > www1: http://www.chw.net/ > www2: http://unreal4u.com/ > -- Mailed by: UnReAl4U - unreal4u ICQ #: 54472056 www1: http://www.chw.net/ www2: http://unreal4u.com/
From: Thijs Lensselink on 14 Sep 2010 02:33
On 09/14/2010 12:16 AM, Camilo Sperberg wrote: > I have some really strange behaviour going on here, and I think it could be > a (minor) PHP's bug. > I am not really sure about what happens internally, but my best guess would > be that after a memory exhaustion, when I try to execute a custom error > handler with the register_shutdown_function (which is executed even after a > fatal error) and try to access the element that provoked the memory > exhaustion, no error should raise instead of *Uninitialized string offset: > 0. > > I have prepared a little test case to reproduce the error and (I hope) can > explain the error. > > <?php > date_default_timezone_set('America/Santiago'); > ini_set('memory_limit','1M'); > ini_set('display_errors',1); > error_reporting(-1); > > function my_error_handler($errno = '0', $errstr = '[FATAL] General Error', > $errfile = 'N/A', $errline = 'N/A', $errctx = '') { > global $clean_exit; > if(empty($clean_exit)) { > ini_set('memory_limit','16M'); > ob_start(); > echo '<h1>PHP v'.PHP_VERSION.', error N° '.$errno.'</h1>'; > ?><h4>-- BEGIN COPY --</h4><p style="font-size:110%;margin:50px 0 20px > 25px"><em>Error N°:</em><br /><?php > echo '<strong>'.$errno.'</strong><br />'; > ?><em>Error Detail:</em><br /><?php > echo '<strong>'.$errstr.'</strong><br /><em>File:</em><br > /><strong>'.$errfile.'</strong><br /><em>Line:</em><br > /><strong>'.$errline.'</strong><br /><em>Debug:</em><br />'; > if (isset($errctx['r']['print'])) echo '<p>THIS LINE GIVES THE ERROR, > WHAT SHOULD IT RETURN?</p>'; Maybe i'm missing something here (kinda sick at home) but.. What do you expect to happen here? When i do a var_dump() on $errctx i get string(0) "" That would explain the error you are seeing. > ?></p><h4>-- END COPY --</h4><?php > $content = ob_get_contents(); > ob_end_clean(); > die($content); > } > } > set_error_handler('my_error_handler'); > register_shutdown_function('my_error_handler'); > > for ($i = 0; $i< 10000; $i++) $a[$i] = mt_rand(1,254); > $r['print'] = print_r($a,TRUE); > echo '<p>Everything fine.</p>'; > > $clean_exit = TRUE; > > * > Would this be a bug or is this expected behaviour? I have tested this on PHP > v5.2.14, I've not tested it yet on 5.3.3, but I guess it would have the same > behaviour. > > Greetings! > |