9

次のエラーが発生する理由を誰かが説明できますか?

コードでecho $gz;は、コメントアウトされている場合、エラーは発生しません(ただし、出力も発生しません)。そうでない場合は、(Firefoxから)取得します。

コンテンツエンコーディングエラー


表示しようとしているページは、無効またはサポートされていない形式の圧縮を使用しているため、表示できません。


あなたの助けに感謝します、ここにコードがあります:

ob_start('ob_gzhandler') OR ob_start();
echo 'eh?';
$gz = ob_get_clean();
echo $gz;
4

2 に答える 2

16

アプリケーションの出力には、1つの出力エンコーディングのみが含まれている必要があります。異なる方法でエンコードされたチャンクが複数ある場合、ブラウザは操作できない結果を受け取ります。したがって、エンコーディングエラー。

コハナ自体はすでに出力バッファを利用しています。これをob_gzhandler出力バッファーと組み合わせたい場合は、kohanaがバッファーを初期化する前にバッファーを開始する必要があります。これは、出力バッファがスタック可能であるためです。kohanaが出力バッファリングを終了すると、次のものが適用されます。

ob_start('ob_gzhandler'); # your buffer:
   ob_starts and ends by kohana

したがって、kohanaが何らかの出力を行うたびに、これらのチャンクは出力コールバック(ob_gzhandler())に渡され、gzでエンコードされます。

最上位レベルの出力バッファであるため、ブラウザはgzでエンコードされたデータのみを取得する必要があります。

ob_gzhandlerを使用し、バッファを手動でエコーします

ob_start('ob_gzhandler')PHPに圧縮を処理させるためにを利用してから、を使用echo ob_get_clean()すると、信頼性の低い出力が作成されます。これは、出力バッファリングと一緒に圧縮がどのように機能するかに関連しています。

PHPは出力のチャンクをバッファリングします。つまり、PHPは出力の圧縮を開始しますが、圧縮を続行するためにいくつかのバイトを保持します。したがって、ob_get_clean()は、バッファのこれまでに圧縮された部分を返します。多くの場合、その結果は完全ではありません。

これに対処するには、最初にバッファをフラッシュします。

ob_start('ob_gzhandler') OR ob_start();
echo 'eh?';
ob_flush();
$gz = ob_get_clean();
echo $gz;

その後、出力がないことを確認してください。

PHPがスクリプトの最後に到達した場合は、それが処理されます。フラッシュと出力です。

ob_flush()次に、手動で呼び出して、PHPがコールバックを介してバッファーをプッシュするように明示的にする必要があります。

Curlを使用したHTTP圧縮の問題の検査

Firefoxはエラーを返すため、エンコーディングエラーの原因を調べるための別のツールが必要です。curl何が起こっているかを追跡するために使用できます。

curl --compress -i URL

すべての応答ヘッダーと本文をエンコードせずに表示しながら、圧縮を有効にしてURLを要求します。PHPは、ob_gzhandlerリクエストヘッダーに基づいてコールバックの圧縮を透過的に有効/無効にするため、これが必要です。

応答は、PHPが必要な応答ヘッダーも設定することも示しています。したがって、手動で指定する必要はありません。ob_start('ob_gzhandler')呼び出すだけでは圧縮が有効になっているかどうかがわからないため、これはさらに危険です。

圧縮が壊れている場合、curlエラーの説明が表示されますが、本文は表示されません。

以下は、誤ったphpスクリプトによって不完全に生成された出力で引き起こされたそのようなcurlエラーメッセージです。

HTTP/1.1 200 OK
X-Powered-By: PHP/5.3.6
Content-Encoding: gzip
...

curl: (23) Error while processing content unencoding: invalid code lengths set

スイッチを追加する--rawことで、生の応答本体にピークを迎えることもできます。

curl --compress --raw -i URL

それは、体の中の圧縮されていない部分のように、何が悪いのかという印象を与えることができます。

于 2011-06-19T15:21:31.230 に答える
0

これはphpharoが行うことです:

/** output buffring */
if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false)
{
 ob_start('ob_gzhandler'); ob_start();
}
else
{
 ob_start();
}
于 2013-11-04T10:57:27.620 に答える