你知不知道任何解决方案,以恢复,从PHP fatal error:"允许存储器的尺寸...尽"

我有一个关闭功能,被称为当一个致命的错误出现。这一功能创建一个ErrorException,并记录。

问题是:在没有更多的存储器可用,它不能记录错误(I登录在萤火虫,通过FirePHP,Zend框架)。

所以我的意思"如何恢复它的",是如何执行基本的错误记录,并让Zend框架发送的头,使得错误记录(在萤火虫在我的情况)作为任何其他的错误呢?

感谢

有帮助吗?

解决方案

此错误是致命错误 - 不能从它恢复装置。如果PHP已经达到它的内存限制,它不能够分配更多的内存来创建你的例外,它需要进行其执行任何其他存储器。

有是错误的另一种类型 - “开捕致命错误”,其顾名思义,可以在一个try / catch被捕获,但不幸的是存储器大小分配是不是其中之一

其他提示

if((memory_get_usage() / 1024 /1024) < 70)

我简单地除以1024 memory_get_usage平方以比较它的“70”“正常”兆字节值。

我遇到了内存问题PHP里面一个for循环,并写了这个简单的if语句,以防止我的脚本掀起了一个致命的错误。另外,我上运行的服务器并没有让我修改内存限制(这往往是一些云服务就像openshift或大型网络主机像Dreamhost的情况)。我真的没有发现任何严重的性能降级(在PHP 5.3,其可以把手功能,因为这稍有不同的PHP 4.x或5.x的......无论如何剧本给予了致命错误性能含义远远超过任何开销函数的调用可强制。而且还将阻止从消耗所有可用的RAM失控脚本。

许多可能争辩;嘿你的软件没有优化。是。你也许是对的;但复杂的数据集,你只能挤这么多的表现出来,你需要扔它更多的内存之前;和追捕在Ajax流内存错误是非常令人沮丧;尤其是当你不知道从哪里你的日志文件。

常规的方式来定义的错误处理过

set_error_handler —设置一个用户定义的差错处理程序功能

该文件为这一功能的状态(重点煤矿):

以下错误类型的无法处理与用户自定义功能: E_ERROR,E_PARSE,E_CORE_ERROR,E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING,大多数E_STRICT提出在文件中set_error_handler()。

因此,它不会的工作,但是你可以试试

为PHP7、错误和例外情况是throwable异常,所以你可以尝试/赶上他们:

PHP错误默认发送到Apache的错误日志/path/to/apache/logs/error.log,你可以看到它在那里。

得到了一个未经检验的招一个想法,我会很高兴地知道,如果它帮助。分配一些全局变量,当你第一次注册的关断功能,并释放它首先执行关闭功能的代码时。然后,您可以有足够的内存来创建Exception对象。让我知道它的工作,并请在这里发布的代码。

这对我来说工作得很好:

try {
    ini_set('memory_limit', (ini_get('memory_limit')+1).'M');
} catch(Exception $e) {}

此假设你的内存限制的格式为123M

我能想到的

一个是你,当你做你的内存密集型操作手动定期查询memory_get_usage()(例如每循环迭代),并转储出你的头/错误时,它越过了一些故障安全值是下面的脚本的限制。它会减慢你的脚本了很多,但至少你会得到的东西回来。

或者,你可能无法做到这一点,运行内存密集型的东西,通过使用EXEC从基于Web的里面的东西被称为基于CLI的脚本。该CLI部分可能倒塌,但Web部件将能够在它的报告。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top