mod_gzip は、Gzip を使用して静的 HTML ページを圧縮する機能を持つ Apache モジュールであり、IETF 標準に準拠するブラウザー (IE、Netscape など) を受け入れることができます。 mod_gzip を使用すると、ページのダウンロード時間が 4 ~ 5 倍長くなる可能性があります。 Web サーバーでは mod_gzip を使用することを強くお勧めします。ただし、PHP で独自の圧縮エンジンを構築する必要もありました。この記事では、PHPの出力制御機能を使ってページの読み込み速度を大幅に高速化する方法を紹介します。
PHP の出力制御機能の紹介
PHP4 で最も満足できる点は、スクリプトによって生成されたすべての出力を PHP にキャッシュさせることができ、コンテンツの送信を決定するまでブラウザーはその出力を受信しないことです。スクリプトでは、これらの関数を使用してヘッダーと Cookie を設定できますが、これは強力な出力関数のほんの一部にすぎません。
<?php void ob_start(void); ?>
は、PHP プロセッサにすべての出力を内部バッファにリダイレクトするように指示します。 ob_start が呼び出されるまで、出力はブラウザに送信されません。
<?php string ob_get_contents(void); ?>
この関数は「出力バッファ」を文字列として返します。この関数を呼び出して、蓄積された出力をブラウザに送信できます。 (バッファリング機能をオフにした後のみ!!)
<?php int ob_get_length(void); ?>
キャッシュ内の文字列の長さを返します。
<?php void ob_end_clean(void); ?>
出力キャッシュをクリアし、出力キャッシュをオフにします。この関数は、キャッシュ内のコンテンツをブラウザに出力する前に使用する必要があります。
void 501([int flag])
暗黙的なフラッシュアクションスイッチのオン/オフを切り替えるために使用されます (デフォルトはオフ)。フラッシュがオンになっている場合、print/echo またはその他の出力コマンドが呼び出されるたびに、出力コンテンツがすぐにブラウザーに送信されます。
出力コントロールを使用して PHP 出力を圧縮する
出力を圧縮するには、PHP4 でコンパイルされた Zlib 拡張パッケージを使用する必要があります。必要に応じて、PHP ドキュメントで Zlib パッケージのインストール手順を参照できます。
まず、出力キャッシュを初期化します:
<?php ob_start(); ob_implicit_flush(0); ?>
その後、print、echo、またはその他の任意のメソッドを使用して、すべての出力コンテンツを生成します。たとえば:
<?php print("Hey this is a compressed output!"); ?>
ページが生成された後、出力コンテンツを取得します:
<?php $contents = ob_get_contents(); ob_end_clean(); ?>
その後、ブラウザが圧縮データをサポートしているかどうかを検出する必要があります。サポートされている場合、ブラウザは ACCEPT-ENCODEING HTTP ヘッダーをサーバーに送信します。 $HTTP_ACCEPT_ENCODING 変数に「gzip,deflate」文字列があるかどうかを確認するだけで済みます。
<?php if(ereg('gzip, deflate',$HTTP_ACCEPT_ENCODING)) { // 在这里生成 Gzip 压缩的内容 } else { echo $contents; } ?>
この方法は使い方が簡単で、構造が明確です。圧縮出力を生成する方法を見てみましょう:
<?php //告诉浏览器将要收到的是gzip数据 //当然在此之前,你已经检查了它们是否支持gzip,x-gzip数据格式 //如果支持的是x-gzip,那么下面的头就要用z-gzip来代替 header("Content-Encoding: gzip"); //显示gzip文件的头 //只需显示一次 echo "x1fx8bx08x00x00x00x00x00"; //计算出文件的大小和CRC码 $Size = strlen($contents); $Crc = crc32($contents); //压缩数据 $contents = gzcompress($contents, 9); //我们不能就这样输出,因为CRC码是混乱的。 //如果我在这里使用“echo $contents”,压缩的数据会被送出, //但是却不完整。文件最后的四个字节是CRC校验码,可是只发出去了三个字节。 //最后一个字节被丢掉了。我不知道这个bug在4.0.2版中解决了没有, //不过最好避免错误的方法是把正确的CRC校验码加到压缩的数据的末尾。 // //把旧的CRC校验码剥离 $contents = substr($contents, 0, strlen($contents) - 4); //仅显示压缩的数据 echo $contents; //输出CRC,和原来数据的大小(字节) gzip_PrintFourChars($Crc); gzip_PrintFourChars($Size); function gzip_PrintFourChars($Val) { for ($i = 0; $i <4; $i ++) { echo chr($Val % 256); $Val = floor($Val / 256); } } ?> //好了,你还可以按此方式附加上更多的压缩数据。
実際のテストでは、すべてのスクリプト コードは次のとおりです:
<?php ob_start(); ob_implicit_flush(0); print("I'm compressed!n"); $contents = ob_get_contents(); ob_end_clean(); header("Content-Encoding: gzip"); echo "x1fx8bx08x00x00x00x00x00"; $Size = strlen($contents); $Crc = crc32($contents); $contents = gzcompress($contents, 9); $contents = substr($contents, 0, strlen($contents) - 4); echo $contents; gzip_PrintFourChars($Crc); gzip_PrintFourChars($Size); function gzip_PrintFourChars($Val) { for ($i = 0; $i <4; $i ++) { echo chr($Val % 256); $Val = floor($Val / 256); } } ?>
PHP 出力をキャッシュする
PHP4 がまだリリースされておらず、PHP3 を使用しなければならなかったとき、私は非常に興味がありました。データベースの読み込みとファイル システムへのアクセスを軽減するためのいくつかのキャッシュ メカニズムを開発しています。 PHP3 には特に優れた方法はありませんが、出力キャッシュを使用すると、PHP4 ではすべてがはるかに簡単になります。
これは簡単な例です:
<?php //为请求的URI构造一个文件名 $cached_file=md5($REQUEST_URI); if((!file_exists("/cache/$cached_file"))||(!is_valid("/cache/$cached_file"))) { //is_valid函数验证缓存,你可以用这个函数检查Cache是否过期或其他特定的条件。 //如果文件不在Cache中或者不可用则生成输出 ob_start(); ob_implicit_flush(0); //在此输出…… $contents = ob_get_contents(); ob_end_clean(); $fil=fopen($cached_file,"w+"); fwrite($fil,$contents,$strlen($contents)); fclose($fil); } /如果请求的文件在缓存中且可用,则: readfile($cached_file); ?>
これは簡単な例です。出力キャッシュを使用すると、複雑なコンテンツ生成システムを構築したり、異なるチャンクやプログラムなどに異なるキャッシュ メカニズムを使用したりできます...
結論
PHP 出力制御関数これは、スクリプトによって生成された出力をキャッシュにリダイレクトするのに非常に役立ちます。 gzip をサポートするブラウザーで圧縮されたキャッシュ データを出力すると、読み込み時間を短縮できます。また、データ ソース (データベースまたはファイル) へのアクセスを減らすためのキャッシュ メカニズムとしても使用できます。これは XML を使用する場合に非常に重要です。
データ ソース (XML ドキュメントとデータベース) からデータをキャッシュし、(外観表示なしで) XML 形式でコンテンツを動的に生成するエンジンを PHP で構築すると、これらの XML の出力を取得し、XSLT を使用して任意の形式に変換できます。欲しい (html、wap、palm、pdf など)。このタスクは、PHP4 の出力キャッシュと Sablotron XSLT 拡張機能を使用してうまく実行できます。
以上がPHP で動的ページをキャッシュおよび圧縮するためのテクニックの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。