2016/10/18 20:35:51

Dockerの公式PHPコンテナでmb系関数を使うにはmbstringモジュールをインストールします

dokcer
目次(クリックするとジャンプします)
  • 1:mb系関数が使えない
  • 2:モジュール入れてないよ
  • 2.1:モジュールのインストール
  • 3:まとめ

mb系関数が使えない

Dockerの公式のPHP7コンテナ(apache入り)でお勉強していたところ、mb系の関数が使えないことに気が付きました。

mb系の関数はマルチバイト文字(日本語)を扱うにはとても便利な関数群です。使えないと結構こまるな〜。

あれ?でも公式のPHP7コンテナってmbstring有効になってなかったっけ?

早速Dockerfileを確認してみると、PHP7のビルド工程でちゃんと--enable-mbstringがあります。

php/7.0/apache/Dockerfileの抜粋

&& ./configure \
        --with-config-file-path="$PHP_INI_DIR" \
        --with-config-file-scan-dir="$PHP_INI_DIR/conf.d" \
        $PHP_EXTRA_CONFIGURE_ARGS \
        --disable-cgi \
# --enable-mysqlnd is included here because it's harder to compile after the fact than extensions are (since it's a plugin for several extensions, not an extension in itself)
        --enable-mysqlnd \
# --enable-mbstring is included here because otherwise there's no way to get pecl to use it properly (see https://github.com/docker-library/php/issues/195)
        --enable-mbstring \
        --with-curl \
        --with-libedit \
        --with-openssl \
        --with-zlib \

モジュール入れてないよ

あっれーっかしいなーと思っていたところ、mbstringもモジュールであることを思い出しました。

そうビルドでenableにしてもモジュールをインストールしないと使えないのです。

いままでレンタルサーバとかの全部のせPHPばっかり使っていたので、Dockerの様な最小限構成主義に戸惑うことになってしまいました。

欲しい機能は自分で入れろというDockerの厳しくもやさしい励ましにより、さっそくmbstringモジュールをインストールします。

通常ならPECLでインストールするのですが、公式のPHPコンテナには便利なスクリプトが用意されていますので、それを使わさせてもらいましょう。

モジュールのインストール

PHPコンテナの中に入って以下のコマンドを実行するとPECLでのインストールが始まります。

# docker-php-ext-install mbstring

インストールが終わったら念の為以下の様にして有効します。

# docker-php-ext-enable mbstring

warning: mbstring (mbstring.so) is already loaded!

もうロードしてるがなと怒られましたが、問題ないです。これでmb系関数が使えるようになります。

apacheでPHPを使うならapacheの再起動が必要です。(コンテナの再起動でいいんです)

これで日本語数え放題ですよ。

まとめ

  • Docker公式のPHP7コンテナではビルド時にmbstringは有効になっている
  • しかしmbstringモジュールはインストールされていない
  • docker-php-ext-installスクリプトで簡単にインストールすることができる
  • 日本語数え放題