phpモジュールにbrotli入れてbrコンテンツを使う!!


ブラウザーのコンテンツの圧縮でよく聞いているのがgzipだと思います。今回UberEatsで使用しようとしたAPIがJson形式だけど、拡張子が「.json.br」でbrotliで圧縮されてそれをそのままだと利用できなかったので、それを解決する方法をまとめた内容です。

Brotliとは

簡単に調べると「https://hackers-high.com/linux/brotli-installation-effect/」でこんな感じで説明されています。

brotliは2015年に発表され、その後Googleによってアップデートされたデータ圧縮アルゴリズムです。

httpにおける圧縮アルゴリズムとして使われることを主な目的としています。従来から広く使われているgzipと比較して、圧縮率が向上していながら、圧縮/伸長速度は同程度を維持しています。ただし、SSL/TLSが必須となっています。どの程度圧縮率が向上しているのかは、Brotilの効果を参照。

圧縮に辞書を併用しているのが特徴で、辞書には"<div/>"、"before"、"普通"などの頻繁に使われるHTMLタグや各言語の表現が約1万語入っており、圧縮をより効率的にしています。

ブラウザーの開発ツール等で見える以下のHeader情報brのことです。

accept-encoding: gzip, deflate, br

対応状況

Fedora / CentOS / RHEL

Remi's RPM repositoryを利用して「php-brotli」の名前でインストールが可能です。

centosの例
# yum install -y php-brotli

その他

Remi's RPM repositoryを利用出来ない場合はbuildしてインストールします。

# git clone --recursive --depth=1 https://github.com/kjdev/php-ext-brotli.git
# cd php-ext-brotli
# phpize
# ./configure
# make
# make install

設定

php.ini及モジュールのディレクトリーに設定ファイルを作成します。

extension=brotli.so

Dockerイメージのphp-fpm

インストールする際にはインストール前に「apt-get update」が必要があります。

FROM php:7.1-fpm
...
RUN apt-get update && apt-get install -y git && \
    git clone --recursive --depth=1 https://github.com/kjdev/php-ext-brotli.git && \
    cd php-ext-brotli && \
    phpize && \
    ./configure && \
    make && \
    make install && \
    printf '%s\n' 'extension=brotli.so'  >> /usr/local/etc/php/conf.d/brotli.ini && \
    rm -rf php-ext-brotli
...

確認

phpのメソードについて:https://github.com/kjdev/php-ext-brotli

$compressed = brotli_compress('Compresstest');

$uncompressed = brotli_uncompress($compressed);

echo $uncompressed;