このエントリーはMagento Advent Calendar 2016の16日目です。
<= 15日目 Satisを使って自作Magentoエクステンションを管理する
=> 17日目 Google Cloud PlatformでMagento2 〜 RedisとCloud SQLまで
決済ページへのフォーム追加の手順を書こうかと思っておりましたが、2016年12月16日リリースのMagento2.1.3においても既知の「intl問題」が解決していなかったので対処方法を書きます。
※ちなみにintlは「Internationalization」の省略名らしい。つまりi18n。
intl問題とは
投入リソース世界最強!のオープンソースECソフトウェアであるMagento2ですが、残念なことにRedHat系Linuxでは日本語と韓国語利用で動作不良が判明しています。これは各種yumリポジトリで提供されているPHP拡張intlが利用するlibICUのバージョンが古く、日本語月名の省略形が含まれていないことが原因です。なお、libICUのバージョンが比較的新しいUbuntuでは発生しません。
Magento公式開発でも「MAGETWO-60828」として対応してくれていますが、2016年12月にリリースされた2.1.3においてもまだ解決していません。
動作不良の内容は「日本語入力内容が消える」「管理画面に入れなくなる」(2.1.2での内容)など様々で、動作不良対象はCentOS7系であればPHP5.6でもPHP7でも発生します。(調査内容はベリテワークスさんの記事も参照)
Ubuntuなら動くとはいえどAmazonLinuxをはじめRedhat系が使えないというのも困ったものですので、公式が対応するまでの凌ぎ方をこのエントリでは共有します。
libICUが古くてダメなのであれば用意する
ポイントは3点、
- libICUとintlを自前でコンパイルする
- PHP5.6を利用する
- PHP7系を使わない
です。
PHP7系についてはpecl/intlが対応していないので以下の方法でコンパイルできません。ここでは無難にPHP5.6を使う方法を紹介しています。
動作確認環境
Magento 2.1.2, 2.1.3
CentOS 7.2
Apache 2.4.6
PHP 5.6.29(ius)
libICU 55.1
作業内容
# libICU,intlのコンパイル
yum remove libicu*
wget http://download.icu-project.org/files/icu4c/55.1/icu4c-55_1-src.tgz
tar zxf icu4c-55_1-src.tgz
cd icu/source/
./configure
make
make install
pecl install pecl/intl
以下新規作成(PHP拡張読み込み)
extension=intl.so
そしてhttpd再起動。
intlの動作確認
intlの動作確認はベリテワークス西さん@hirokazu1225が作ってくれたシンプルなスクリプトで確認できます。
まとめ
以上でintl問題は一応解決しますが、このままだとPHP7が使えませんので、pecl/intlとMAGETWO-60828のリリースをチェックしておきましょう。
参考
issues:「PHP message: PHP Fatal error: Uncaught TypeError: Argument 1 passed to iterator_to_array() must implement interface Traversable」
HirokazuNishi/check.php