Safely catch a 'Allowed memory size exhausted' error in PHP
memory, php
Solution
As this answer suggests, you can use `register_shutdown_function()` to register a callback that'll check `error_get_last()`.
You'll still have to manage the output generated from the offending code, whether by the `@` (shut up) operator, or `ini_set('display_errors', false)`
ini_set('display_errors', false);
error_reporting(-1);
set_error_handler(function($code, $string, $file, $line){
throw new ErrorException($string, null, $code, $file, $line);
});
register_shutdown_function(function(){
$error = error_get_last();
if(null !== $error)
{
echo 'Caught at shutdown';
}
});
try
{
while(true)
{
$data .= str_repeat('#', PHP_INT_MAX);
}
}
catch(\Exception $exception)
{
echo 'Caught in try/catch';
}
When run, this outputs `Caught at shutdown`. Unfortunately, the `ErrorException` exception object isn't thrown because the fatal error triggers script termination, subsequently caught only in the shutdown function.
You can check the `$error` array in the shutdown function for details on the cause, and respond accordingly. One suggestion could be reissuing the request back against your web application (at a different address, or with different parameters of course) and return the captured response.
I recommend keeping `error_reporting()` high (a value of `-1`) though, and using (as others have suggested) error handling for everything else with `set_error_handler()` and `ErrorException`.
Problem
I have a gateway script that returns JSON back to the client. In the script I use set_error_handler to catch errors and still have a formatted return. It is subject to 'Allowed memory size exhausted' errors, but rather than increase the memory limit with something like ini_set('memory_limit', '19T'), I just want to return that the user should try something else because it used to much memory. Are there any good ways to catch fatal errors?