【问题标题】:PHP output buffering - sounds like a bad idea, is it?PHP 输出缓冲 - 听起来是个坏主意,是吗?
【发布时间】:2010-12-06 02:38:54
【问题描述】:

只是想在 php 输出缓冲方面挑选专家的大脑。有时我出于某种原因想要实现它,但总是设法重新排列我的代码以绕过它。

我避免使用它,因为它听起来会耗费资源。我的意思是,如果他们可以为编码器提供如此出色的灵活性,为什么他们不总是缓冲输出呢?我能想出的唯一答案是:因为不缓冲它可以节省大量资源,并且通过良好的编码实践,你不应该需要它。

我离这儿很远吗?

【问题讨论】:

    标签: php performance output-buffering


    【解决方案1】:

    根据我的经验,对性能没有显着影响。我也找不到关于这个主题的一致答案——有些人声称对性能几乎没有任何影响,而有些人则说影响很小但很重要。甚至在 php.net 上也有评论表明,与多个输出函数相比,缓冲 提高了 性能,而不是我已经验证过这一点或任何东西。

    我认为是否缓冲的问题更多地与您的应用程序的预期用途有关。如果您想在发送输出之前压缩输出,或者如果您想准确控制输出在代码中发生的时间和位置,那么缓冲就很有意义。由于添加缓冲不需要花费太多精力,因此您不妨尝试一下-如果需要,删除它应该相对容易。

    【讨论】:

    • 哇,这是我第一次听说...性能的潜在提升。你说得对,我应该玩它,尤其是在我处于开发阶段的时候。
    • 性能提高是有逻辑的原因——php 没有“中断处理”,因此处理速度更快,因为它是连续的——数据传输本身也是如此。当然,它似乎一次会使用更多的内存,但它持有它的时间更短。尽管您可能正在加载一些需要更多的框架/库,因此考虑到“正常”源代码输出量,这应该不是一个显着差异...... :-)
    【解决方案2】:

    我认为恰恰相反。除非您遇到真正需要它的情况,否则不缓冲输出是一个坏主意。例如,一个会产生大量输出的脚本。

    在大多数情况下,花费大量程序员时间来节省一些未知数量的(便宜的)内存听起来像是在浪费资源。

    【讨论】:

    • 有一个想法......使用它,但有办法在输出大量时将其关闭。好点子,伙计!
    • 对于具有大量输出的脚本(想想一些发送一堆 csv 数据或其他东西的报告),“关闭”它的最简单方法就是 ob_end_flush();在脚本的顶部。您可以(尝试)使用 flush(); 强制在循环内输出输出;
    • 当你有 20,000 个用户占用你服务器的所有资源时,它的内存并不便宜。
    • @MichaelHanon - 如果您认为程序员的时间是免费的,这只是不便宜。您的应用程序代码已经分配了兆字节的内存(尤其是如果您使用流行的框架),几百千字节的缓冲输出不太可能起到作用。
    【解决方案3】:

    如果您处于内容在标题之前输出的情况,则需要将其填充到缓冲区中,否则页面将错误地指出内容是在标题之前输出的。这发生在我的共享库中,没有足够的时间进入并进行适当的修复以启动。它是其中一个标记 //TODO / FIXME 然后返回并稍后使其正确。

    【讨论】:

      【解决方案4】:

      使用输出缓冲,我能够为我上一个 PHP 项目的自制 MVC 后端快速制作轻量级模板系统。我喜欢它,发现它非常有用。

      关于资源:这不是资源密集型的。如果您担心它使用的东西很少,那么 PHP 不是适合这项工作的工具。我喜欢 PHP,但它不是最轻的选择。不过,在任何相当现代的服务器上,这都无关紧要。

      【讨论】:

      • @Dinah,我的印象是 PHP 是超级轻量级​​的……但这可能是因为我习惯了 ColdFusion。还有什么更轻的?
      • @Aaron C 或 ASM。 PHP 是一种非常灵活的语言,它通常比任何其他桌面语言(如 C、C++、Java、C# 等)都要慢。但是,与其他脚本语言相比,它仍然可以相当快。
      • @Aaron。让我们将 Web 技术与 Web 技术进行比较:PHP 比 Python、RoR、Javascript 更快。如果你选择 Phalcon PHP 框架,那么它比 ASP.NET MVC 更快,Swoole PHP 比 Node.JS 更快,并且非常适合 IoT / REST / 网络应用程序。使用 OpCache,您可以使其更快。 PHP JIT 是 PHP 8.0(在撰写本文时正在开发中)的一部分。 PHP 简单(经济高效)、灵活(例如,在 PHP 中“强数据类型”是可选的)和轻量级。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多