Bug #42334 [Nab]: Error after ob_start causes buffer flush
Edit report at https://bugs.php.net/bug.php?id=42334&edit=1
ID: 42334
Updated by: yohgaki@php.net
Reported by: ahaig at penguinmililtia dot net
Summary: Error after ob_start causes buffer flush
Status: Not a bug
Type: Bug
Package: Output Control
Operating System: Irrelevant
PHP Version: irrelevant
Block user comment: N
Private report: N
New Comment:
Instead of requesting changes in output buffer, request use of exception or make E_ERROR catchable.
Previous Comments:
------------------------------------------------------------------------
[2016-09-24 01:15:56] mbutscher at gmx dot de
One possible way to create a fatal error (ok, only if programmer is lazy)
function foo() ...
if (<usually false>)
foop(); // spelling error
As long as the if-clause is false the error won't be noticed.
------------------------------------------------------------------------
[2016-09-24 00:43:06] yohgaki@php.net
Output buffer is flushed when PHP terminates execution. Current PHP cannot catch E_ERROR. This
prevents cleaning up buffer, but not E_USER_ERROR. e.g.
set_error_handler(function ($errno, $errstr, $errfile, $errline)
{
if (!(error_reporting() & $errno)) {
// This error code is not included in error_reporting
return;
}
switch ($errno) {
case E_USER_ERROR:
ob_clean(); //////////////// CLEAN UP BUFFER //////////////////////
echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
echo " Fatal error on line $errline in file $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br
/>\n";
echo "Aborting...<br />\n";
exit(1);
break;
case E_USER_WARNING:
echo "<b>My WARNING</b> [$errno] $errstr<br />\n";
break;
case E_USER_NOTICE:
echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
break;
default:
echo "Unknown error type: [$errno] $errstr<br />\n";
break;
}
/* Don't execute PHP internal error handler */
return true;
});
ob_start();
echo 'test';
trigger_error('error', E_USER_ERROR);
$output = ob_get_contents();
ob_end_clean();
?>
We have not many problematic E_ERRORs in our code base now. Most problematic E_ERRORs are in SOAP
module.
------------------------------------------------------------------------
[2016-09-23 23:36:49] mbutscher at gmx dot de
At least if ob_start is called like e.g.
ob_start(NULL, 0, PHP_OUTPUT_HANDLER_CLEANABLE | PHP_OUTPUT_HANDLER_REMOVABLE);
it should (as far as I understand) forbid to flush the buffer contents even on error.
------------------------------------------------------------------------
[2007-08-20 07:50:58] jani@php.net
Hint: Try changing the error to E_USER_WARNING instead.
(fatal errors stop script processing and are..eh..FATAL..:)
------------------------------------------------------------------------
[2007-08-19 20:00:46] jani@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to
report
a bug at http://bugs.php.net/how-to-report.php
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=42334
--
Edit this bug report at https://bugs.php.net/bug.php?id=42334&edit=1
Thread (10 messages)