画面上部に「PHP Notice: ob_end_flush(): Failed to send buffer of zlib output compression (0) in…」という表示が出る原因と対処

公開日:2023(令和5)年12月23日/最終更新日:

WordPress Trouble Shooting and Repair | Personal WP Customization Notes (PWCN)

【景品表示法に基づく表記】ページ内のコンテンツには、商品プロモーションが含まれています

WordPressでデバッグログを有効にしていたら大量に出力されるようになった「PHP Notice: ob_end_flush(): Failed to send buffer of zlib output compression (0) in…」というNoticeメッセージ。

内容としては、wp_ob_end_flush_all()というフックで不都合が生じているというメッセージで、Noticeなのでエラーというわけではなく、zlib圧縮の際に正常にフラッシュ(初期化)されない不都合が発生しているというものです。

全く詳しくないですが、zlib圧縮はzip形式の圧縮ファイルやPNG形式の画像を圧縮する機能のようですが、私はその機能について明るくないので、詳しく知りたい方は「Zlib 圧縮」などを参照ください。

ちなみにこのNoticeなどが画面に表示されるという方は、本来無効にしておくことが望ましいWordPressのデバッグモードが有効になってしまっているかも知れませんので、以下を参考に無効に切り替えることをおすすめします。

「PHP Notice: ob_end_flush(): Failed to send buffer of zlib output compression (0) in…」が出る原因

実際にNoticeが出ている箇所のコードを確認してみたところ、以下のような記述がありました。

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

これはPHPのバージョン5.2以降でWordPressを稼働させた際に、zlib圧縮の機能を使いなさいというもの(と私は認識)で、notice(注意)が出る原因は、このプログラムで機能させているものと同じものが別の機能でも処理されている、つまり処理が競合しているためだと思われます。

従って、以下の2つの方法でこの競合をなくすことができます。

「PHP Notice: ob_end_flush(): Failed to send buffer of zlib output compression (0) in…」の改善方法

前項で競合していると書いたのは、前述したようにWordPressでzlib圧縮機能を使いなさいと言っているのに、別の場所で同じことをしようとしているということで、その正体はサーバーの設定にあります。

つまり、WordPress側でこの機能を使うようにしておくのか、サーバー側でこの機能を使うようにしておくのかを明確にすることで、「PHP Notice: ob_end_flush(): Failed to send buffer of zlib output compression (0) in…」という注意は出なくなります。

サーバーによって設定の変更ができる場合とできない場合がありますので、以下のうち、自身で対処できる方を使ってテストしてみてください。

対処方法1:サーバー側の機能を停止する方法

サーバーの管理にcPanelというツールを使用しているサーバー(Mixhostやカラフルボックス ColorfulBoxなど)では、cPanelの「MultiPHP INIエディタ」というリンクをクリックした画面で調整できると思います。

画面を開いたら、対象のドメインを選択し、「zlib.output_compression」という項目の設定を無効にします。

無効にしたら、サイトの管理画面をリロードして、noticeが出なくなっているかを確認します。出なくなっていればこの設定で正解かと思われますので、後程紹介する「zlib圧縮が機能しているかの簡易確認方法」を見てテストをしてください。

対処方法2:WordPress側の機能を停止する方法

こちらはサーバー側に設定項目がない場合に、WordPress側の機能を停止して対処する方法です。

有効化しているテーマのfunctions.phpへ以下のコードを追加します。

/* WordPress側のzlib圧縮を無効にする */
remove_action( 'shutdown', 'wp_ob_end_flush_all', 1 );
add_action( 'shutdown', function() {
	while ( @ob_end_flush() );
} );

参考:ob_end_flush

コードを追加したら、サイトの管理画面をリロードして、noticeが出なくなっているかを確認します。出なくなっていればこの設定で正解かと思われますので、後程紹介する「zlib圧縮が機能しているかの簡易確認方法」を見てテストをしてください。

zlib圧縮が機能しているかの簡易確認方法

zlib圧縮はサーバーからブラウザに送信されるデータのサイズを圧縮して小さくする機能で、うまくいっていないと大きなデータがそのまま転送され、ページの表示速度がダウンしたり、サーバーに余計な負荷がかかる可能性があります。

従って上記いずれかの方法を行った際にページの転送量に変化がないかを確認します。

確認はChromeブラウザならデベロッパーツールを使うといいでしょう。

まずはどちらかの方法で競合を解消した形で、サイト内の投稿や固定ページの1つを開き、デベロッパーツールを開いて「ネットワーク」タブを開いた状態でリロードし、画面下部に表示される転送量を確認します。

次に未対策の状態(サーバー側でOFFにしていたものをONに戻す、functions.phpに追記したものを一旦削除する)に戻して再度同じページをリロードして、転送量を確認します。

多少異なる値になりますが、ほとんど差異がないようでしたら、本ページの対策によって競合状態は解消していると言えますので、設定を競合しないように元に戻して対処完了です。

もしもいずれかの方法でも「PHP Notice: ob_end_flush(): Failed to send buffer of zlib output compression (0) in…」の注意情報が消えない場合や、差異が多分に生じる場合は、サーバー側の設定の問題である可能性が高いため、本ページの方法では解消できず、さらに調査が必要でしょう。

, , ,
Lolipop ServerMoshimo Ad x-serverMoshimo Ad

WordPress Trouble Shooting and Repair | Personal WP Customization Notes (PWCN)
サブディレクトリにある一部のサイトだけPHPのバージョンが異なる原因と対処方法