注意:ob_end_flush():无法发送 zlib 输出压缩缓冲区 (1) in

问题描述 投票:0回答:14

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

我的代码:

<?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
14个回答
44
投票

我不建议完全禁用

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

/**
 * 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() );
} );

有关原因的更多详细信息以及为什么这可能是最好的方法可以在此处找到:WordPress ob_end_flush() 错误的快速修复


39
投票

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

ob_end_flush()

您应该能够保持压缩状态,并且只需松开冲洗操作即可:

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

您现在可以手动调用

ob_end_flush()
,并保持 zlib 压缩。


10
投票

php.ini

中关闭zlib.output_compression时解决了

zlib.output_compression = Off


3
投票

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

如果您想隐藏 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 的前端,并且您将运行如果页面同时点击太多,则存在内存耗尽的风险。


2
投票

我发现我们客户的一个 WP 网站上的问题是由某个特定插件引起的。

在这种情况下,这是由“NextGEN Gallery”插件引起的,但奇怪的是,简单地停用然后激活该插件就解决了问题。

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


1
投票

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

remove_action( '关机', 'wp_ob_end_flush_all', 1 );

0
投票

另一种情况:

我在我的实时站点上收到此通知,但不在本地主机和临时/演示站点上收到此通知,即使演示站点与实时站点位于同一服务器上。

事实证明,zlib 扩展未在实时站点上激活,并且导致了该通知。一旦 zlib 扩展被激活,通知就不再出现。 因此不需要修复代码


0
投票

只需在关闭挂钩上使用您的代码并提前定位位置 默认的 ob_end_flush() 将识别你的输出并刷新它

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

0
投票

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

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

ob_get_clean();

0
投票

此错误可能是由于没有关闭而导致的

?>
我在收到“插件在激活期间生成了意外输出的 X 个字符”错误然后激活调试后来到这里。我将 index.php 中的包含文件缩小为有/没有错误的目标文件。然后我进入该文件,并使用 PHP 标签关闭该文件,因为该文件内有许多函数。之后就工作了。


0
投票

1.创建此文件:

wp-content/mu-plugins/fix-zlib.php

创建

mu-plugins
文件夹(如果不存在)

2.将此代码复制到其中并保存

<?php

/**
 * Fix zlib Error
 */
remove_action( 'shutdown', 'wp_ob_end_flush_all', 1 );
add_action( 'shutdown', static function () {
  $levels = ob_get_level();
  for ( $i = 0; $i < $levels; $i ++ ) {
      @ob_end_flush();
  }
}, 9999999 );

完成!


-1
投票

不要惊慌,就这么简单。只需打开函数 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%解决了。


-1
投票

替换这个

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
投票

尝试禁用wordpress调试模式即可解决。 您可以在

/wp-config.php
:

中禁用 WP 调试模式
define('WP_DEBUG', FALSE);
© www.soinside.com 2019 - 2024. All rights reserved.