mb系関数が使えない
Dockerの公式のPHP7コンテナ(apache入り)でお勉強していたところ、mb系の関数が使えないことに気が付きました。
mb系の関数はマルチバイト文字(日本語)を扱うにはとても便利な関数群です。使えないと結構こまるな〜。
あれ?でも公式のPHP7コンテナってmbstring
有効になってなかったっけ?
早速Dockerfileを確認してみると、PHP7のビルド工程でちゃんと--enable-mbstring
があります。
&& ./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スクリプトで簡単にインストールすることができる
- 日本語数え放題