【问题标题】:Notice: ob_end_flush(): failed to send buffer of zlib output compression (1) in注意:ob_end_flush(): 发送 zlib 输出压缩 (1) 的缓冲区失败
【发布时间】:2016-12-06 05:56:07
【问题描述】:

我在本地主机上没有任何问题。但是当我在服务器上测试我的代码时,每一页的结尾我都会看到这个通知。

我的代码:

<?php
ob_start();
include 'view.php';

$data = ob_get_contents();
ob_end_clean();
include 'master.php';
ob_end_flush();  // Problem is this line

【问题讨论】:

    标签: php wordpress compression buffer zlib


    【解决方案1】:

    WordPress 尝试在关闭时刷新输出缓冲区。失败是因为你已经调用了ob_end_flush()

    您应该能够保持压缩,并简单地取消刷新操作:

    remove_action( 'shutdown', 'wp_ob_end_flush_all', 1 );
    

    您现在可以手动调用ob_end_flush(),并保持zlib 压缩开启。

    【讨论】:

    • 为什么我们需要删除对 wp_ob_end_flush_all() 的调用,因为它实际上使用了缓冲区级别(通过 ob_get_level() - 请参阅code here),这是一个谜。它应该自动检测级别并仅运行正确数量的 ob_end_flush() 调用,但它运行的次数过多。这似乎是一个错误!
    • 将此添加到您的子主题 function.php - 为我完成了这项工作
    • 使用这个解决方案经常会产生以下通知:“ob_end_flush(): failed to delete and flush buffer. No buffer to delete or flush”。并且没有回答一个基本问题:为什么这不会发生在每个 wordpress 安装上,而不是在每个服务器上?
    【解决方案2】:

    我不建议完全禁用wp_ob_end_flush_all() 功能,我绝对不会在您的php.ini 文件中关闭zlib.output_compression。这是一种更好的方法,可以替换导致问题的源代码,并保留底层功能:

    /**
     * Proper ob_end_flush() for all levels
     *
     * This replaces the WordPress `wp_ob_end_flush_all()` function
     * with a replacement that doesn't cause PHP notices.
     */
    remove_action( 'shutdown', 'wp_ob_end_flush_all', 1 );
    add_action( 'shutdown', function() {
       while ( @ob_end_flush() );
    } );
    

    关于原因的更多细节,以及为什么这可能是最好的方法可以在这里找到:Quick Fix for WordPress ob_end_flush() Error

    【讨论】:

    • 就我而言,在 WordPress 网站上,我可以确认这种方法对页面速度有积极影响,而不是 @alexg 的方法。
    • 凯文,你的方法对我不起作用。将您的代码放在我的子主题的functions.php、主主题的functions.php 和wp-includes 中。我发现您的文章在某些地方有点模棱两可 - 例如 - 我们没有删除 wp-includes/functions.php 中的函数 wp_ob_end_flush_all?
    • 感谢分享。它对我有用。
    【解决方案3】:

    关闭php.ini中的zlib.output_compression时解决了

    zlib.output_compression = Off

    【讨论】:

    • 关闭 gzip 压缩对我来说似乎不是一个有效的解决方案。
    • 我同意@Swen。输出压缩(无论是 deflate 还是 gzip)几乎总是在 SEO 基准测试中提供积极的方面,包括 Google 的 PageSpeed 洞察。禁用它可能会损害您在搜索结果中的位置,因为它会增加移动用户的加载时间。
    • @Adambean ... 是的,但是 gzip 压缩几乎总是在网络服务器级别打开,所以 PHP 预压缩可以被认为是不必要的,不是吗?
    【解决方案4】:

    我发现一个特定的插件是我们客户的一个 WP 网站上的原因。

    在这种情况下,它是由“NextGEN Gallery”插件引起的,但奇怪的是,只需停用然后激活插件即可解决问题。

    对于遇到此问题的其他人来说,寻找可疑的前端插件并尝试相同是值得的。如果您在重新激活罪魁祸首插件后发现问题再次出现,您应该向插件作者提出问题。

    【讨论】:

    • 插件(WP Smush)似乎也给我造成了这个问题。虽然删除并重新安装它修复了它而不是禁用/重新启用。
    【解决方案5】:

    出于安全原因,您应该始终禁用实时网站上的正面错误 - 无论如何。

    如果您想在 Wordpress 中隐藏错误并获取错误日志以供审查,您可以在 wp-config.php 文件中执行以下操作:

    // Enable WP_DEBUG mode
    define( 'WP_DEBUG', true );
    
    // Enable Debug logging to the /wp-content/debug.log file
    define( 'WP_DEBUG_LOG', true );
    
    // Disable display of errors and warnings
    define( 'WP_DEBUG_DISPLAY', false );
    @ini_set( 'display_errors', 0 );
    

    PS:如果你想使用上面alexg的remove_action代码,remove_action('shutdown', 'wp_ob_end_flush_all', 1);你需要把它放在你主题的functions.php文件中。

    PPS:您可能还想尝试在 wp-config.php 文件中使用 define(‘WP_MEMORY_LIMIT’,’1024M’); - 但是,请注意不要分配超出您需要的内容,因为这会影响 Wordpress 的前端并且您如果页面上的同时点击次数过多,则会冒内存不足的风险。

    【讨论】:

      【解决方案6】:

      另一个场景:

      我在实时站点上收到此通知,但在 localhost 和暂存/演示站点上没有收到此通知,即使演示站点与实时站点位于同一台服务器上。

      事实证明,zlib 扩展没有在现场激活,它导致了通知。一旦 zlib 扩展被激活,通知就停止了。 因此无需修复代码

      【讨论】:

        【解决方案7】:

        只需将此添加到主题functions.php文件中

        remove_action('shutdown', 'wp_ob_end_flush_all', 1);

        【讨论】:

          【解决方案8】:

          不要惊慌,就这么简单。只需打开函数 php 并找到此代码

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

          在你简单地删除“ob_end_flush();”之后并替换此代码

          remove_action( 'shutdown', 'wp_ob_end_flush_all', 1 );

          100% 解决了。

          【讨论】:

          • 编辑核心文件是个坏主意。
          • 编辑核心文件并不是大多数人的理想解决方案。编辑的文件将在下一次核心更新时恢复。编辑核心文件还会在安装的其他区域引入副作用问题。 wordpress.org/support/article/editing-files/…
          【解决方案9】:

          把这个ob_end_flush()替换成remove_action( 'shutdown', 'wp_ob_end_flush_all', 1 )

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

          更新后的代码应如下所示

          function wp_ob_end_flush_all() {
              $levels = ob_get_level();
          
              for ( $i = 0; $i < $levels; $i++ ) {
                  remove_action( 'shutdown', 'wp_ob_end_flush_all', 1 );
              }
          }
          

          【讨论】:

            【解决方案10】:

            只需在关闭挂钩上使用您的代码并更早地确定位置 默认的 ob_end_flush() 会识别你的输出并刷新它

                add_action('shutdown', 'your_code', 0);
            function your_code(){
            /* Your Code Goes here */
            }
            

            【讨论】:

              【解决方案11】:

              我尝试了一种可行的蛮力方法(我对此不满意,但希望这可以帮助某人):

              /wp-content/themes//functions.php的最后一行(显然在php闭包'?>'之前)添加以下行:

              ob_get_clean();
              

              【讨论】:

                【解决方案12】:

                尝试禁用 wordpress 调试模式并解决。 您可以在/wp-config.php 中禁用 WP 调试模式:

                define('WP_DEBUG', FALSE);
                

                【讨论】:

                • @Casper 所说的。这实际上可能更糟,因为您可能只是得到一个白页,没有任何迹象表明出了什么问题,尤其是 HTTP OK [200] 响应。调试模式应保持打开,直到问题解决,然后关闭。
                • 在这种特殊情况下,是的,这是一个坏主意。但是,安装一个全新的 WP 5.4.1 并定义('WP_DEBUG', true);正如任何开发人员都应该做的那样,给我这个关于 zlib.output_compression 的错误。将其设置为 false 使错误消失。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2011-05-31
                • 2015-05-23
                • 2018-09-12
                • 1970-01-01
                • 2017-01-26
                • 2012-02-26
                • 1970-01-01
                相关资源
                最近更新 更多