CentOS6でMagento2用の環境を作る際の注意点」で、Magento2を日本語で動作させる場合に、PHPバージョンによっては動作しないケースがあることをお伝えしました。

その後調査を進めたところ、更に衝撃的な結果が得られました。

CentOSとUbuntu LinuxにおけるMagento2の動作検証結果

まず最初に動作検証結果です。
この結果は2016年7月時点のもので、かつ標準のCentOS(Redhat Enterprise Linux)とUbuntu Linuxに対して行ったものです。Amazon LinuxやScientific Linuxなどの派生ディストリビューションや、ホスティング会社が独自に提供している構成のLinuxについては対象外ですので、注意してください。

CentOS6.xとPHP5.6/7.0に対するMagento2の動作検証結果

まずはCentOSに対する動作検証結果です。

OSバージョン 6.x 7.x
PHPバージョンと
パッケージ
5.6 Remi Remi
IUS IUS
epel - epel -
7.0 Remi Remi
IUS IUS
epel epel

CentOS6でMagento2用の環境を作る際の注意点」でお伝えしたとおり、PHP7.0のパッケージではRemiのものはCentOS6.xと7.xともに動作しませんでした。
また、CentOS7.xではIUSとepelの両リポジトリが提供するパッケージも動作しませんでした。

この結果から言えることは、「CentOS(RedHat Enterprise Linux)7.xではMagento2をPHP7.0上で日本語サイトとして動かすことができない」ということです。

Ubuntu Linux 14.04LTSと16.04LTSに対する動作検証結果

次にUbuntu Linuxに対する動作検証結果です。

Ubuntu Linux 14.04ではondrejのパッケージを使用し、16.04は標準のパッケージを使用しました。
(16.04では標準でPHP7が付属します)

OSバージョン 14.04 LTS 16.04 LTS
PHPバージョン 5.6 -
7.0

結果として、Ubuntu Linuxは特に問題なく動作しました。
弊社でも普段開発およびお客様にご提供する環境としてUbuntu Linuxを使用していますので、これはある程度予想できていた結果です。

CentOSで動作しない原因とは

この現象はMagento2に起因するものではなく、PHPのIntlエクステンションとlibICUの相性によって引き起こされます。

正しく動かない環境では、

$bundle = new \ResourceBundle('ja_JP', 'ICUDATA');
$icuData = iterator_to_array($bundle['calendar']['gregorian']['monthNames']['format']);

というコードを実行した際に、月の別名を格納する子要素の「abbreviated」が取得できません。
Magento2が管理画面でカレンダーを描画するためにこの値を使用しているため、値が取得できない環境で管理画面を日本語にすると即エラーが発生します。

対策

さて、CentOSでMagento2をPHP7.0で動作させ、管理画面を日本語にすると確実にエラーが出ることは明らかになりました。
弊社からご提示できる対策としては、以下のようなものがあります。

  • CentOSではなくUbuntu Linuxに乗り換える
  • CentOS上で独自にコンパイルしたPHPやlibICUを使う
  • 当座(2017年半ばまで)はPHP5.6を使う

もちろん、動作するパッケージが提供されることが最も望ましいですが、直ちにというのは難しいのではないかと思います。