HTTP プロトコルには、応答がいつ終了したかを判断する方法が必要です。によると
RFC2616 セクション 4
4.4 メッセージの長さ
メッセージの転送長は、メッセージに表示されるメッセージ本文の長さです。つまり、転送コーディングが適用された後です。メッセージ本文がメッセージに含まれている場合、その本文の転送長は、次のいずれかによって決定されます (優先順)。
1. メッセージ本文を含めてはならない応答メッセージ (1xx、204、304 応答、および HEAD 要求への応答など) は、ヘッダー フィールドの後の最初の空行で常に終了します。メッセージに存在するエンティティ ヘッダー フィールド。
2. Transfer-Encoding ヘッダー フィールド (セクション 14.41) が存在し、「アイデンティティ」以外の値を持つ場合、転送長は「チャンクされた」転送コーディング (セクション 3.6) を使用して定義されます。接続を閉じることで終了します。
3. Content-Length ヘッダー フィールド (セクション 14.13) が存在する場合、OCTET の 10 進値は、エンティティの長さと転送長の両方を表します。これら 2 つの長さが異なる場合 (つまり、Transfer-Encoding
header field is present). If a message is received with both a
Transfer-Encoding header field and a Content-Length header field,
the latter MUST be ignored.
4.メッセージがメディアタイプ「マルチパート/バイトレンジ」を使用し、転送長が特に指定されていない場合、この自己区切りメディアタイプが転送長を定義します。このメディア タイプは、受信者が解析できることを送信者が認識していない限り、使用してはなりません (MUST NOT)。1.1 クライアントからの複数のバイト範囲指定子を含む Range ヘッダーのリクエストに存在することは、クライアントが multipart/byteranges レスポンスを解析できることを意味します。
A range header might be forwarded by a 1.0 proxy that does not
understand multipart/byteranges; in this case the server MUST
delimit the message using methods defined in items 1,3 or 5 of
this section.
5.サーバーが接続を閉じることにより。(接続を閉じることは、サーバーが応答を送り返す可能性を残さないため、要求本文の終わりを示すために使用することはできません。)
HTTP/1.0 アプリケーションとの互換性のために、メッセージ本文を含む HTTP/1.1 リクエストには、サーバーが HTTP/1.1 準拠であることがわかっている場合を除き、有効な Content-Length ヘッダー フィールドを含める必要があります。リクエストにメッセージ本文が含まれていて、Content-Length が指定されていない場合、サーバーは、メッセージの長さを判断できない場合は 400 (不適切なリクエスト) で応答する必要があります。有効な Content-Length を受け取ります。
エンティティを受信するすべての HTTP/1.1 アプリケーションは、「チャンクされた」転送コーディング (セクション 3.6) を受け入れなければならないため、メッセージの長さが事前に決定できない場合に、このメカニズムをメッセージに使用できます。
メッセージには、Content-Length ヘッダー フィールドと非 ID 転送コーディングの両方を含めてはなりません。メッセージに非 ID 転送コーディングが含まれている場合、Content-Length は無視する必要があります。
メッセージ本文が許可されているメッセージで Content-Length が指定されている場合、そのフィールド値はメッセージ本文の OCTET の数と正確に一致する必要があります。HTTP/1.1 ユーザー エージェントは、無効な長さを受信して検出した場合、ユーザーに通知する必要があります。
ヘッダーをランダムに追加して、それらに従うことを期待することはできません (他のヘッダーが上書きされる可能性があります)。最初に生成されたオーバーライドする可能性のあるすべてのヘッダーを制御する必要があります。
この質問 ( How to make PHP generate Chunked response ) によると、「チャンク」を強制する良い方法は、Transfer-Encoding とflush
. おそらく、これら2つは厳密には必要ありません。バッファリングを開始する前に、無関係なフラッシュがどこかにありますか?