一尘不染

安全地捕获PHP中的“允许的内存大小用尽”错误

php

我有一个网关脚本,它将JSON返回给客户端。在脚本中,我使用set_error_handler捕获错误,并且仍然具有格式化的返回值。

它受到“允许的内存大小用尽”错误的约束,但是与其使用ini_set(’memory_limit’,‘19T’)之类的方法来增加内存限制,我只是想返回用户应该尝试其他方法的原因,因为它过去经常记忆。

有什么好的方法可以捕获致命错误?


阅读 256

收藏
2020-05-29

共1个答案

一尘不染

就像这个答案所暗示的那样,您可以register_shutdown_function()用来注册将检查的回调error_get_last()

无论是@闭嘴 )运算符,还是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';
}

运行时,输出Caught atshutdown。不幸的是,ErrorException没有抛出异常对象,因为致命错误触发了脚本终止,随后仅在关闭函数中被捕获。

您可以$error在关闭功能中检查阵列以获取有关原因的详细信息,然后做出相应的响应。一个建议可能是针对您的Web应用程序重新发出请求(
在不同的地址或使用不同的参数 ),然后返回捕获的响应。

我建议保持error_reporting()较高 的值-1值为 ),并使用( 如其他人所建议的
)对set_error_handler()和进行其他所有操作ErrorException

2020-05-29