处理PHP的致命错误(Fatal Error 或 E_ERROR)

如何处理PHP的E_ERROR或Fatal Error是一件麻烦事。当程序因为内存不足、执行超时等等而出现致命错误意外中断时,也需要进行相关的处理,而这时error_reporting与try...catch都不适用。

这时可以利用PHP的register_shutdown_function函数。

手册上写的很明确:register_shutdown_function — Register a function for execution on shutdown,就是说当程序中断时会调用该函数注册的函数。

比如:

<?php
function shutdown() {
echo 'Script executed with success', PHP_EOL;
}
register_shutdown_function('shutdown');
?>


当然,任何的程序中断都会触发用此方法注册的函数,包括exit()等等。如果想只用来处理某段程序的致命错误,这时需要进行一下判断,可以参考一下代码:


<?php
class Test {
private $running;

public function __construct() {
register_shutdown_function(array($this, 'shutdown_handler'));
}

public function main() {
$this->running = true; //开始监测
echo "Hello ";
$this->error(); //(undefined method)触发一个致命错误
echo "World ";
$this->running = false; //结束监测
}

public function shutdown_handler() {
if ($this->running) {
echo '抱歉出错了~';
@header("Location: error.php");
}
}
}

$t = new Test();
$t->main();
?>


更新:其实这里可以使用error_get_last()函数来获取最后一条错误

<?php
public function shutdown_handler() {
$error = error_get_last();
if ($error['type'] == 1) { //只针对E_ERROR
echo '抱歉出错了~';
@header("Location: error.php");
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误的意思是 JavaScript 堆内存不足。这意味着你的程序尝试使用更多内存,但是电脑上可用的内存不足以满足需求。 这种情况通常发生在你的程序中存在内存泄露(memory leak)或者你的程序使用了过多的内存。 解决方法可能包括: - 寻找并修复内存泄露 - 优化你的程序,减少内存使用 - 尝试使用更大的内存限制来运行你的程序(例如,使用 `node --max-old-space-size=4096 script.js` 运行你的程序) ### 回答2: "FATAL ERROR: CALL_AND_RETRY_LAST 分配失败 - JavaScript堆内存不足"是一个常见的错误消息,通常在使用Node.js时出现。它表示JavaScript堆内存用尽,导致无法继续执行程序。 这个错误通常发生在使用大量内存的操作时,比如处理大型数据集或使用递归算法。由于JavaScript的内存有限,当内存不足时,引擎会抛出这个错误。 要解决这个问题,有以下几种方法: 1. 增加Node.js的可用内存:可以通过命令行选项将内存限制增加到更高的值。例如,使用--max-old-space-size标志指定更大的内存限制。 2. 优化代码和算法:检查代码中是否存在内存泄漏或不必要的内存消耗。使用合适的数据结构和算法,以减少内存使用。 3. 分批处理数据:如果程序需要处理大量数据,可以考虑将数据分成小块逐个处理,而不是一次性处理全部数据。 4. 使用流式处理:如果可能的话,使用流式处理数据而不是一次性加载整个数据集。这样可以减少内存消耗,并提高程序的性能。 总之,"FATAL ERROR: CALL_AND_RETRY_LAST 分配失败 - JavaScript堆内存不足"错误提示意味着程序使用了超出可用内存的JavaScript堆内存。通过调整内存限制、优化代码和算法、分批处理数据或使用流式处理,可以解决这个问题。 ### 回答3: "FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory"(致命错误:CALL_AND_RETRY_LAST分配失败-JavaScript堆内存不足)通常是在运行JavaScript代码时遇到的错误。这个错误表示JavaScript堆内存不足,无法为执行的代码分配足够的内存。 造成这个错误的原因通常是因为代码运行过程中占用的内存超过了JavaScript引擎的限制。JavaScript的堆内存由JavaScript引擎管理和分配,用于存储变量、对象和其他内存分配。 要解决这个问题,可以尝试以下方法: 1. 增加内存限制:通过在运行时增加Node.js应用程序的最大内存限制,可以尝试解决内存不足的问题。可以使用以下命令行参数调整内存限制: node --max-old-space-size=4096 app.js 这个命令将将内存限制增加到4GB(4096MB),可以根据实际需求进行调整。 2. 优化代码:检查代码中是否存在内存泄漏或者不必要的内存占用。释放不再使用的变量和对象,避免创建过多的临时变量或大型数据结构。 3. 分批处理数据:如果代码处理大量数据,可以考虑使用分批处理的方式,避免一次性加载大量数据导致内存溢出。 4. 使用流处理:对于处理大型文件或网络请求的场景,可以使用流处理来减少对内存的需求。通过逐步读取并处理数据,可以避免一次性将所有数据加载到内存中。 5. 升级或更新JavaScript引擎:如果以上方法无效,可以尝试升级或更新使用的JavaScript引擎,以获取更好的内存管理和性能。 不同场景下的解决方法可能会有所不同,以上仅为常见的解决方法。根据具体情况调整和尝试以上方法,应该能够解决"FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory"错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值