代码之家  ›  专栏  ›  技术社区  ›  Jrgns

如何阻止PHP输出缓冲区超过内存限制?

  •  2
  • Jrgns  · 技术社区  · 16 年前

    我的大多数PHP应用程序在开始时都有一个ob_start,运行所有代码,然后在完成所有操作后输出内容,有时会进行一些修改。

    ob_start()
    //Business Logic, etc
    header->output();
    echo apply_post_filter(ob_get_clean());
    footer->output();
    

    header session_* 电话。

    一些想法:

    1. 将所有缓冲内容写入临时文件并输出该文件。
    2. 当缓冲区达到一定大小时,输出它。尽管这可能会干扰后期过滤器。
    3. 提高内存限制(thanx@Troleskn)。

    这些方法的缺点是什么?特别是提高内存限制?

    5 回复  |  直到 16 年前
        1
  •  6
  •   troelskn    16 年前

    编辑:很明显,仅仅因为脚本加满而提高内存限制应该会引起一些危险,但在我看来,这是一个合法的情况——例如,脚本实际上产生了相当大的输出块。因此,您必须存储输出 ,而且出于性能和方便性的考虑,内存似乎是最佳选择。

    我还应该注意,内存限制设置只是一个限制。不消耗太多内存的脚本不会因为您提高了限制而消耗更多内存。它存在的主要原因是为了防止行为不端/有缺陷的脚本破坏整个服务器。如果有很多业余爱好者在共享主机上进行黑客攻击,那么这一点非常重要(PHP在这方面已经被大量使用)。因此,如果这是您自己的服务器,或者至少您通常知道自己在做什么,那么低内存限制并没有什么好处。

        2
  •  2
  •   I GIVE TERRIBLE ADVICE    16 年前

    你应该在做任何事情之前提高内存限制,特别是如果你唯一的解决方案是通过一个临时文件。

    使用临时文件有各种各样的缺点(主要是速度较慢),如果您真的需要在输出缓冲区之前存储缓冲区,请寻找 memcached APC cache . 这将使您的操作与文件大致相同,只是您可以快速访问RAM。

    不过,我必须说,总的来说,这是一个糟糕的想法。如果缓冲区当前无法正常工作,那么您可能会构建一些不同的东西,以使您的站点工作得更好。

        3
  •  2
  •   okoman    16 年前

    如果PHP错误是缓冲输出的唯一原因,请考虑使用StIGErrRoxHuffer-Load。使用此函数,您可以为脚本中的错误定义自定义回调。使用它将消息保存在某个位置,然后打印出来。

    http://www.php.net/set_error_handler

        4
  •  2
  •   Haravikk    11 年前

    我的建议是尝试分阶段加载该文件,或者将其拆分为更小的部分以供包含。您如何做到这一点在很大程度上取决于文件是什么,但它允许您以2mb块的形式加载它,如果它不产生任何错误,那么您可以使用 ob_flush() 在加载下一个块之前发送它。

    您可能还想查看一种在加载模板之前预先验证模板的机制,这样就不必担心错误会蔓延到页面中。

    虽然更改内存限制将在短期内“解决”问题,但这不是一个长期的解决方案,因为如果可能,肯定要避免这种内存使用。一般来说,如果可以避免的话,您根本不想将任何大的数据加载到内存中,或者尽早将其吐出,因为这意味着数据至少正在发送给用户的过程中,这减少了页面到达第一个字节的时间。

        5
  •  1
  •   J.D. Fitz.Gerald    16 年前

    若要因输出而耗尽内存,必须输出大量数据或内存限制非常低。大约4年前,8mb的内存限制是很常见的,也是合理的。但是随着使用对象和更好的编码风格的转变,我所遇到的脚本的内存使用量增加了。

    memory_get_usage() 将返回此时脚本使用的内存量。

    您当前运行的内存限制是多少?您是否在共享环境中运行? 目前,根据服务器的不同,我的内存限制在64到128之间。

    如果只是要增加限制的脚本的特定子集,则可以按每个脚本执行:

    ini_set('memory_limit','64M');
    

    如果您不想限制脚本,可以将其设置为-1