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

时间:2016-08-01 08:18:11

标签: php buffer zlib

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

我的代码:

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

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

12 个答案:

答案 0 :(得分:19)

WordPress尝试在关闭时刷新输出缓冲区。之所以失败,是因为您已经呼叫了ob_end_flush()

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

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

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

答案 1 :(得分:6)

php.ini

中关闭zlib.output_compression时解决了问题

zlib.output_compression = Off

答案 2 :(得分:2)

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

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

对于其他任何有此问题的人,值得寻找可疑的前端插件并尝试使用。如果您发现再次启动罪魁祸首插件时问题再次出现,则应向插件作者提出问题。

答案 3 :(得分:2)

别着急,这很简单。只需打开函数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%。

答案 4 :(得分:1)

出于安全原因,您应该始终禁用实时网站上的前端错误-不管。

如果您想在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的前端和如果页面上同时点击的次数过多,则会冒用完RAM的风险。

答案 5 :(得分:0)

我不建议您完全禁用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() );
} );

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

答案 6 :(得分:0)

另一种情况:

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

原来,zlib扩展未在实时站点上激活,并且正在引起通知。一旦激活zlib扩展,通知便停止了。 因此不需要代码修复

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

将此 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 :(得分:0)

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

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

ob_get_clean();

答案 11 :(得分:-6)

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

define('WP_DEBUG', FALSE);