PHP异常内存泄漏

时间:2018-02-05 23:11:39

标签: php memory-leaks exception-handling

在我的控制台应用程序中,我用throw ErrorException替换了显示所有PHP内置错误类型:

set_error_handler(function ($severity, $message, $file, $line) {
    if (!(error_reporting() & $severity)) {
        // This error code is not included in error_reporting
        return;
    }

    throw new ErrorException($message, 0, $severity, $file, $line);
});

效果很好,但有一个问题。请考虑以下代码段:

for ($id = 1;; $id += 1) {
    try {
        $html = file_get_contents('https://stackoverflow.com/boo/' . $id);
    } catch (Exception $exception) {
        // Failed
    }
}

抛出的每个ErrorException都会保留堆栈历史记录。在现实生活中的例子中,一些ID丢失并导致,因此经过数千次迭代后,最终会发生内存泄漏。

可以采取哪些措施来解决这个问题?抛出和捕获异常是一个循环错误?或者我可能会以某种方式禁用堆叠行为?

1 个答案:

答案 0 :(得分:0)

在每次迭代中使用Exception对象后,就可以取消设置它:

function getLevels($start_idx,$levels = 9){
   try {
            return $this->getBinaryTree($levels);
        } catch (Exception $e) {
            switch($e->getMessage()){
            case "Almost out of memory":
               $max_tree_depth = (int)($levels/2);
               if($max_tree_depth >= 2){
                    unset($e); // <------------------------ RIGHT HERE!
                    return $this->getLevels($start_idx,$max_tree_depth);
               }else{
                    throw new Exception("Out of memory even after getting tree with 2 levels");
               }
               break;
            default:
               throw $e;
         }
     }
}

我在下面的链接中找到了解决方案:

https://stuporglue.org/php-memory-leak-when-throwing-catching-and-recursing/