如何在PHP中安全地捕获“允许的内存大小已耗尽”错误?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (90)

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

它受“允许的内存大小耗尽”错误影响,但不是像ini_set('memory_limit','19T')那样增加内存限制,我只想返回用户应该尝试的其他方法,因为它过去很多记忆。

有没有什么好方法来捕捉致命错误?

提问于
用户回答回答于

你可以使用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';
}
用户回答回答于

如果你在发生此错误时需要执行业务代码,注册关闭功能是不够的:你应该以某种方式释放内存。

一种解决方案是在某处分配一些紧急内存:

public function initErrorHandler()
{
    // This storage is freed on error (case of allowed memory exhausted)
    $this->memory = str_repeat('*', 1024 * 1024);

    register_shutdown_function(function()
    {
        $this->memory = null;
        if ((!is_null($err = error_get_last())) && (!in_array($err['type'], array (E_NOTICE, E_WARNING))))
        {
           // $this->emergencyMethod($err);
        }
    });
    return $this;
}

扫码关注云+社区

领取腾讯云代金券