ホームページ > バックエンド開発 > PHPチュートリアル > PHP はリアルタイムでブラウザにメッセージを出力します_PHP チュートリアル

PHP はリアルタイムでブラウザにメッセージを出力します_PHP チュートリアル

WBOY
リリース: 2016-07-13 17:48:33
オリジナル
1420 人が閲覧しました

Yahoo のフロントエンド最適化手法の 1 つは、HTML の 部分を最初に出力することです (バッファを早期にフラッシュします)。この方法で、ブラウザは head を取得した後、head に css/js ファイルをダウンロードできます。全体を待たずに最初にHTMLをダウンロードした後、head内のcss/jsをダウンロードすることで、Webページを開く速度が向上します。

Transfer-Encoding: chunked ヘッダーが http1.1 に追加されました。このヘッダーの機能は、メッセージを出力のために複数のチャンクに分割することです。

メッセージの形式は次のとおりです:
Javaコード
チャンクボディ = *チャンク
「0」CRLF
フッター
CRLF
チャンク = チャンク サイズ [ チャンク拡張 ] CRLF
チャンクデータ CRLF
hex-no-zero =
チャンクサイズ = 16 進数、ゼロなし *16 進数
チャンク拡張子 = *( ";" チャンク拡張子名 [ "=" チャンク拡張子値 ] )
チャンク外部名 = トークン
チャンク拡張値 = トークン引用符付き文字列
チャンクデータ = チャンクサイズ(オクテット)
フッター = *エンティティヘッダー

チャンクボディ = *チャンク
「0」CRLF
フッター
CRLF
チャンク = チャンク サイズ [ チャンク拡張 ] CRLF
チャンクデータCRLF
hex-no-zero =
チャンクサイズ = 16 進数、ゼロなし *16 進数
チャンク拡張子 = *( ";" チャンク拡張子名 [ "=" チャンク拡張子値 ] )
チャンク外部名 = トークン
チャンク拡張値 = トークン引用符付き文字列
チャンクデータ = チャンクサイズ(OCTET)
フッター = *エンティティヘッダー
CRLE: キャリッジリターンとラインフィード (rn)
例:
Javaコード
... Transfer-Encoding: chunked #ヘッダー内の 2 CRLE の後にメッセージを開始します
                                                                                     1 4 テスト 0
... Transfer-Encoding: chunked #ヘッダー内の 2 CRLE の後にメッセージを開始します
                                                                             1 #chunk のサイズを 16 進数で指定し、CRLE を追加します
4 テスト0


PHP で ob_flush を使用すると、チャンク出力を実現するために Transfer-Encoding: chunked ヘッダーが自動的に追加されますが、使用中にその効果が得られないことがよくあります。いくつかの問題を考慮する必要があります

1.PHPバッファ
PHP が Apache モジュールで実行されている場合は、フラッシュ関数を使用して PHP 出力に通知してください。 fastcgi モードで実行している場合は、ob_flush を使用して php に通知します。現時点では、gzip は失敗し、チャンク方式は各ブロックの独立した圧縮をサポートしていません。出力全体が圧縮された後でのみ、圧縮されたパッケージをチャンクで出力できます。互換性を確保するには、最初に ob_flush を呼び出してから、flush を呼び出します。

2. ブラウザバッファ
Transfer-Encoding: chunked ヘッダーに遭遇したときにブラウザーがどのように反応するかは、ブラウザーの実装によって異なります。私の実験では、Firefox ではチャンクのサイズに関係なくリアルタイムでチャンク データが表示されますが、IE8 と Chrome では一定時間経過後に表示されます。したがって、一部のブラウザでは有効になる前に、まず一定のサイズを出力する必要があります。

3. リバースプロキシサーバー
使用しているリバースプロキシサーバーはhttp1.1プロトコルをサポートしていますか?バックエンドのチャンク化はどのように処理されますか?プロキシバッファがいっぱいになる前にチャンクに遭遇した場合、バックエンドに従って出力されますか?

nginxのプロキシ機能はhttp1.0のみ対応しており、プロキシバッファが一杯の場合のみ出力します。

4. 高速CGIバッファ
FastCGI モードで実行している場合、Web サーバーは独自の fastcgi バッファーを持ち、出力する前にバッファーがいっぱいになるまで待機することがあります (これは nginx の場合です)。フラッシュ関数はPHPの出力バッファ出力のみを通知できます

チャンク転送エンコーディング
ハイパーテキスト転送プロトコル -- HTTP/1.1 チャンク転送エンコーディング
ob_flush と flash の違いを深く理解する

http://www.bkjia.com/PHPjc/478424.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/478424.html技術記事 Yahoo のフロントエンド最適化手法の 1 つは、HTML のヘッド部分を最初に出力することです (バッファーを早期にフラッシュする)。この方法では、ブラウザーはヘッドを取得した後、待つことなく最初にヘッドに css/js ファイルをダウンロードできます。 ...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート