PHPで圧縮アルゴリズム「Brotli」を利用して圧縮ファイルを生成するBrotli入門
今回は「Brotli」というGoogleが作った圧縮アルゴリズムを徹底的に調べ、検証して、PHPでどのように圧縮ファイルを生成するかまでのBrotli入門としての記事を作成致します。ResizeCDN自体はgzipで圧縮を掛けていますので圧縮率と簡単に導入できるのであれば圧縮をBrotliにて行おうかなと思います。
また、なぜサーバーで圧縮しないの?という質問も多いと思いますが、Web高速化やCDNのお仕事をしていると必然的に「事前圧縮」という答えにたどり着きます。
極限まで高速化したいのであれば「事前圧縮」一択です。
目次
- 圧縮アルゴリズム「Brotli」とは?
- 注意点としてはBrotliはHTTPSが必須
- ブラウザのBrotli対応状況
- サーバーのBrotli対応状況
- プログラミング言語のBrotli対応状況
- PHPで圧縮アルゴリズム「Brotli」を利用して圧縮ファイルを生成するBrotli入門
- gzipとの比較をしてみた
- まとめ
圧縮アルゴリズム「Brotli」とは?
Brotli(ブロトリと読むらしいです)はGoogleが開発したオープンソースの新しいLZ77アルゴリズムをベースとした圧縮アルゴリズムです。 Jyrki Alakuijalaさん、Zoltán Szabadkaさんという人が作ったらしいです。言語はCですね。由来はスイスで“小さなパン”を意味する「Brotli」(ドイツ語)となっています。
初版は2017年9月21日で執筆している現時点の最新版は1.0.9 2020年8月27日です。
Webにおける圧縮アルゴリズムとして使われることを主な目的としており従来から広く使われているgzipと比較して圧縮率が向上しております。(だいたい5%〜15%)
ただgzipより圧縮の処理が遅いためにアクセスが来てその場で圧縮して返すのではなく事前圧縮を行い配信した方が良さげですね。
https://github.com/google/brotli注意点としてはBrotliはHTTPSが必須
各種ブラウザでBrotli圧縮を使うにはHTTPS通信が必要ですのでWebサーバーにはSSLの設定が必須です。最近の傾向としては95%以上がHTTPS化していると思われますのでここに関しては問題ないですね、ただテスト環境でのテストは難易度が上がっており捨てドメインなどが必要です。
ブラウザのBrotli対応状況
引用元:https://caniuse.com/?search=Brotli
2021年03月21日現時点で94.5%IE以外ほぼ全てのブラウザで対応済みとなっております。これは導入する以外選択肢はない、という状態まで来てるんじゃないかなと思われます。
サーバーのBrotli対応状況
Apache(httpd 2.4.26より対応)
Nginx
コンパイルの際に、「–enable-brotli」と指定して導入となります。その際にbrotliのライブラリパスの指定が必要となります。その都度、ググってください。当該記事ではPHPを使用して圧縮を致します。
Google提供のngx_brotliモジュールにより対応可能。libbrotliをインストールしてngx_brotliをインストールして導入となります。
プログラミング言語のBrotli対応状況
PHP
JAVA
Node.js
拡張モジュールにより、Brotliでの圧縮対応となります。後ほど書きます。
軽くググった所できそうでした。
オフィシャルでサポートはありませんが、コミュニティモジュールを導入することで対応可能となります。
PHPで圧縮アルゴリズム「Brotli」を利用して圧縮ファイルを生成するBrotli入門
どんだけ本題遅いんだよって感じですが、ここからPHPでのBrotli入門とさせて頂きます。
まずはこちらのリポジトリを目がさらになるまでチェックしてください。kjdev/php-ext-brotli
今回行う最低想定環境は
- CentOS 8以上
- PHP7.2以上
とさせて頂きます。
まず初めにgitとmakeインストールしてない方はgitとmakeをインストールをして下さい。
dnf install git dnf install make
次にphp-ext-brotlをダウンロードしてPHPにビルドしていきましょう。
// gitコマンドでphp-ext-brotliダウンロード git clone --recursive --depth=1 https://github.com/kjdev/php-ext-brotli.git // 移動 cd php-ext-brotli // phpize実行 phpize // configure実行 ./configure // make make make install
PHPにビルドが完了しましたら次はphp.iniに追記しなくてはいけない記述がありますのでphp.iniを開きましょう。
// php.iniを開く
vi /etc/php.ini
どこか空いてる箇所に
extension=brotli.so
を追記しましょう。(コメントアウトしている箇所には記述しないでね)
追記して保存しましたらhttpdを再起動しましょう。
systemctl restart httpd
これでPHPで圧縮ファイルを生成する準備は整いました。
次は実際にPHPを動かしてBrotliでの圧縮ファイルを生成する方法です。
<?php
/*************************
brotliでの圧縮ファイル生成
**************************/
// 圧縮するファイル準備(ここはなんでもよい)
$content = file_get_contents('http://sharetube.jp/article/4642/');
// brotliでの圧縮
$compressed = brotli_compress($content);
// 通常の方法
file_put_contents($_SERVER['DOCUMENT_ROOT']."/test.br", $compressed);
// 公式の方法
file_put_contents("compress.brotli://".$_SERVER['DOCUMENT_ROOT']."/test.html.br", $compressed);
/*
確かに2つのファイルを見比べると微妙に違いがあり。今回は完璧なテスト環境が用意でなかったので(テスト用ドメイン)
実際にbrotliファイルを開いてページ表示まではできませんでした。
時間がある時にでもテストは必要。
*/
指定するファイルや場所はどこでも大丈夫です。今回はVPSの構築をマスターする手順書 in ボクとサーバの2週間戦争。という昔に書いた大作を指定して圧縮しました。
どのくらい圧縮されたかというと84%圧縮されました。エグいっすね。
gzipとの比較をしてみた
で、gzipとの比較も重要じゃないですか。他でも検証をしている所もあるのですが本当かどうかを実際に手を動かして比較してみました。
<?php
/***********************
gzipでの圧縮ファイル生成
************************/
// 元ファイルの内容を読み込む
$code = file_get_contents('http://sharetube.jp/article/4642/');
// gzip圧縮処理して同一フォルダにファイルを作成
$gzip = gzopen('/var/www/html/test.html.gz' ,'w9');
gzwrite($gzip ,$code);
gzclose($gzip);
検証1回しかしないのかよというツッコミは多いにあると思いますが、検証しているページはクッソコンテンツ量が多いのでおそらくこのページで検証する事に意味があると思います。
gzipでの圧縮の結果は80%の圧縮となりました。brotliとgzipの検証比較
- brotliが84%圧縮
- gzipが80%圧縮
少しながらbrotliの方が圧縮されていますね。
まとめ
足早に説明を進めてきましたが、PHPでのbrotli入門として全て説明をさせて頂きました。圧縮の結果内容としては他のサイトでの検証と少々違うのであれ?と思われる方もいらっしゃると想定しますが、同じ文言が多いほど圧縮は可能となります。今回使用した検証記事は重複したワードが少なかった事が起因かもしれません。
それでも84%という圧縮は「凄い」の一言です。最先端の技術ですし極限までWebページを高速化する方法としてはマストなのではないでしょうか?
- 圧縮はもちろん最新画像フォーマットにも対応
ResizeCDNを利用すると圧縮・最新画像フォーマットに自動対応して配信できます。
- 全体対応・特定の箇所のみと柔軟なCDN配信が可能
プッシュ型ならでは柔軟な対応とハイスピード最短1分でCDN化ができます。