【问题标题】:How to debug "Fatal error: Allowed memory size of xxx bytes exhausted" in PHP如何在 PHP 中调试“致命错误:允许的 xxx 字节内存大小已用尽”
【发布时间】:2019-12-03 21:58:35
【问题描述】:

调试“致命错误:允许的内存大小为 268435456 字节已用尽”错误的最佳策略是什么?我得到的这个错误很奇怪,而且显然有问题。导致它的功能是

/**
 * Flush all output buffers for PHP 5.2.
 *
 * Make sure all output buffers are flushed before our singletons our destroyed.
 *
 * @since 2.2.0
 */
function wp_ob_end_flush_all() {
    $levels = ob_get_level();
    for ($i=0; $i<$levels; $i++)
        ob_end_flush();
}

我只是重新设置了一些我正在处理的代码并开始获取它。 你的调试策略是什么?

【问题讨论】:

  • 你为什么要这样循环$levels?当您致电ob_end_flush() 时,无论如何您都在清除OB。

标签: php


【解决方案1】:

在使用 EasyPhp-Devserver-16.1 启动 Apache 服务器时,我也遇到了这个错误。

在我的例子中,这是因为 Easy php 试图加载一个太大的 error.log 文件。

删除旧服务器登录

C:\Program Files (x86)\EasyPHP-Devserver-16.1\eds-binaries\httpserver\apache2418x160331124251\logs

创建一个空的解决了我的问题。

希望这可以帮助其他人。

【讨论】:

    【解决方案2】:

    试试下面的代码,如果你的代码达到指定的字节数,它就会回显它并退出。而不是崩溃:

    function wp_ob_end_flush_all() {
        $levels = ob_get_level();
        for ($i=0; $i<$levels; $i++){
            ob_end_flush();
            if(memory_get_peak_usage() > 268435400) { // 268435456 
                echo memory_get_peak_usage(). ' reached! now we should stop the script.' ;
                break; // or die();
            } 
        }
    }
    

    更新 要回答您的问题,调试泄漏的一种方法是使用xdebug 另一种方法是使用我在示例中提供的函数或将您的可疑函数包装为memory_get_usage 并比较差异。

    【讨论】:

    • 我正在使用 256MB 并且有东西泄漏。我无法更改该功能,它是 wordpress,我只是想知道是否有一种简单的方法可以检测导致泄漏的功能。这实际上是一个树枝渲染调用。
    • 非常感谢。我的情况是由“超大”文本列数据引起的。这是我的自动发布软件引起的问题。我想知道用户是否可以滥用网络界面插入大量文本数据以使我的网站崩溃
    • @PhamHuyAnh 您需要始终期待最坏的情况,并通过添加各种检查以避免攻击来使您的代码健壮,您甚至可以在某些情况下更改服务器配置,但要回答您的问题,是的,用户总是可以出于好的或坏的意图使您的系统崩溃,避免这种情况发生是您的责任,还可以考虑将日志记录添加到您的应用程序以跟踪正在发生的事情。
    【解决方案3】:

    通常,当您达到内存限制时,解决方案不会绕过它、扩大允许的大小或给出受控错误。您要做的是找出导致溢出的原因。

    您正在使用 256Mb,并在仅涉及输出缓冲区的循环中消耗所有它们,所以出了点问题。

    先做,检查你尝试做多少次迭代

    function wp_ob_end_flush_all() {
        $levels = ob_get_level();
         die ($levels); 
    }
    

    【讨论】:

    • 我正在使用 256MB 并且有东西泄漏。我无法更改该功能,它是 wordpress,我只是想知道是否有一种简单的方法可以检测导致泄漏的功能
    • 如果您在该函数中遇到错误,则错误将出现在以 ob_ (输出缓冲区)开头的某些函数中,或者在某些写入缓冲区的函数中,这可能是任何一个。所以会很难。你可以试试 xdebug。任何方式,你有没有试过我所说的死($levels)?它将打印嵌套缓冲区的数量,如果很少,会很复杂,但如果这个数字很大,你就会知道发生了什么,也许你可以更快地解决它。如果你这样做了,请回来告诉你得到了什么号码
    【解决方案4】:

    在我的例子中,这是因为 Easyphp 试图加载一个太大的 error.log 文件。 删除eds-binaries\httpserver\apache2418x160331124251\logs 中的服务器日志文件帮助我解决了问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-06
      • 2015-07-06
      • 2018-05-19
      • 1970-01-01
      • 1970-01-01
      • 2014-04-07
      • 2016-09-24
      相关资源
      最近更新 更多