php.ini で zlib 圧縮出力をオンにしたことによる文字化けの問題について
次のような PHP スクリプトがあるとします。
<?phpob_clean();echo "hello world";
ただし、php.ini 設定を変更した場合ファイル、zlib 圧縮出力を有効にします:
上の赤いボックスの設定オプションをオンに変更し、保存して Apache を再起動し、今すぐスクリプトを実行すると、文字化けが表示されます:
これはなぜですか? PHP スクリプトを変更して、echo ステートメントをコメントアウトしてみましょう。
<?phpob_clean();//echo "hello world";
次にこのとき、php.ini 設定ファイルで zlib 圧縮出力がオンになっている前提で、ob_clean() を直接使用すると余分な出力が発生するため、文字化けの原因がわかります。ブラウザに奇妙な文字:
IE を変更してみてください。結果は同じです。特殊文字のスタイルのみが変更されました:
Linux でも同じ問題が Windows でも存在します。これは、Windows の問題ではないことを証明しています。では、この特殊文字を削除するにはどうすればよいでしょうか。 ob_clean() を使用する前に ob_start() を使用する限り、これは非常に簡単です。
<?phpob_start();ob_clean();echo "hello world";ob_start() を追加した後、後続のhello worldは文字化けせず正常に表示できました。
これで結論を導き出すことができます: ob_clean() が PHP スクリプト内で直接呼び出され、サーバーの php.ini zlib 圧縮出力をオンにすると、後続の出力内容がすべて文字化けします。この時点で、zlib 圧縮出力をオフにするか、ob_clean() の前に ob_start() を追加する必要があります。そうしないと、この問題を解決できません。ただし、プログラマには通常、サーバー構成を変更する権限がないことを考慮して、コーディングするときは、ob_clean() を使用する前に ob_start() を呼び出すことを忘れないでください。
最後に、その理由についてzlib が出力を圧縮した後、ob_clean() を直接呼び出すと、プログラムが余分な特殊文字を出力し、文字化けが発生します。ただし、この問題は、閉じた後は問題なく実行されます。 、または PHP マスターならその理由を説明できますか?