さくらのレンタルサーバPHP7環境でintlモジュール有効化

## 概要

さくらのレンタルサーバーのPHP7では、intlモジュールが有効になってません。外部のライブラリを設置して有効化する手順をまとめてます。

|| 動作環境 |
|:--|:---|
| OS| FreeBSD 9.1-RELEASE-p24 (SAKURA__) #0: Thu Feb  5 10:03:29 JST 2015|
| PHP| PHP 7.1.7 (cgi-fcgi) (built: Jul 27 2017 19:46:53) |

## 手順

### PHP7の選択
さくらのコントロールパネル( https://secure.sakura.ad.jp/rscontrol/ )にログインして、左側メニュー「■ PHPのバージョン選択」を選ぶ。

![PHP_version_menu.PNG](https://qiita-image-store.s3.amazonaws.com/0/75600/a269caeb-cc06-d94e-4b2c-4bc2a03e238e.png)

右側のフォームで、PHP7.xを選択して「変更」実施

![php_version_select.PNG](https://qiita-image-store.s3.amazonaws.com/0/75600/644e9978-f9b5-c556-2748-9adc75325a3c.png)

### SSHで作業

SSHでログイン後、ビルドと公開用のフォルダ作成

```shell-session
% mkdir -p ~/usr/local/src
% mkdir -p ~/usr/local/php/extension
```

ICUのビルド

```shell-session
% cd ~/usr/local/src
% wget http://download.icu-project.org/files/icu4c/58.1/icu4c-58_1-src.tgz
% tar zxvf icu4c-58_1-src.tgz
% cd icu/source
% ./configure --prefix=$HOME/usr/local
% gmake
% gmake install
```

php-7.1.7に同梱されているintlをビルド

```shell-session
% cd ~/usr/local/src
% wget https://github.com/php/php-src/archive/php-7.1.7.zip
% unzip php-7.1.7.zip
% mv php-src-php-7.1.7/ext/intl ./intl-php-7.1.7
% rm -rf php-src-php-7.1.7
% cd intl-php-7.1.7
% phpize
% ./configure --with-icu-dir=$HOME/usr/local --with-php-config=/usr/local/php/7.1/bin/php-config
% make
```

modulesフォルダにできたintl.soを、拡張モジュール指定用のフォルダへコピー

```shell-session
% cp ~/usr/local/src/intl-php-7.1.7/modules/intl.so ~/usr/local/php/extension/
```

### php.iniの設定
さくらのコントロールパネル( https://secure.sakura.ad.jp/rscontrol/ )にログインして、左側メニュー「■ PHP設定の編集」を選ぶ。

![PHP_version_menu.PNG](https://qiita-image-store.s3.amazonaws.com/0/75600/a269caeb-cc06-d94e-4b2c-4bc2a03e238e.png)

設定フォームに拡張フォルダと、ファイル名を指定して更新。

```ini
extension_dir = /home/さくらのユーザー名/usr/local/php/extension
extension=intl.so
```


![php_ini.PNG](https://qiita-image-store.s3.amazonaws.com/0/75600/0d3bb1ca-8367-2ab7-8cc1-c09ccfdc5600.png)

### （参考）phpinfo() で確認

![intl.png](https://qiita-image-store.s3.amazonaws.com/0/75600/eadb0d2c-79e7-00e0-9a7d-e20d5f511dc0.png)

---

## 参考サイト

### さくらのレンタルサーバPHP5.x環境でのintl導入手法
さくらのレンタルサーバに Symfony2 を入れようとして嵌った件
http://qiita.com/yositani/items/76e81a43822f5e29fded
さくらのレンタルサーバにCakePHP3を導入
https://moshimore.jp/knowledge/2016/08/09/sakura_server_cakephp3/

### ICUの脆弱性
ICU4C のライブラリに脆弱性
https://jvn.jp/vu/JVNVU97322697/
Locale クラスにおけるスタックベースのバッファオーバーフローの脆弱性
http://jvndb.jvn.jp/ja/contents/2016/JVNDB-2016-004810.html
※上記情報より、一応58_1を使っておいた

---

## 経緯、所感など

### 下記urlの方と同じ状況になっておりました

さくらのレンタルサーバー PHP7.1でのintl extensionについて
https://teratail.com/questions/84206

上記の回答で紹介されているintl使わないプラグイン

intlless
https://github.com/chinpei215/cakephp-intlless/blob/master/README.ja.md

は、日本語/英語切り替えるサイト構築の予定だったので使えませんでした。（でもこのプラグインすごい）


### で、いろいろ調査

PHP 5.3.0 以降にはintlは同梱されている
http://php.net/manual/ja/intl.installation.php

PHP 5.5までで使えるintl
https://pecl.php.net/package/intl

> They may be preferrable to those bundled with PHP 5.5 due to being compiled against a more recent version of ICU.
> ・・・同梱されているもののほうが、新しいICUに対してコンパイルされているので、それを使ったほうがいいよ

そうでしたか。

### 対応方針

* さくらインターネットさんあてに、
「php7でintl有効化したのにしてほしいです」
という要望を一応出してみた。

これやってもらえれば一番いいので、期待する。

* なんとか、php7に同梱されたソースをコンパイルして、intl.soをつくる

上記紹介した作業でなんとかできた。


### 一応できたのだが、メンテナンスは面倒

- PHPのバージョンに関して、今回はPHP7.1.7だったので、それにあわせたソースを持ってきた。
さくらさんが提供するPHPのバージョンにあわせたintlを作り直して置くようにしたほうがいいような気がする
（同梱しているので、整合が取れているはず）なので、PHPのバージョンを気にしておく必要がある。

- ICUのバージョンアップは、59が現状でコンパイルできなかった（g++かなんかが古いのかも）ので結構きびしいかも