概要
さくらのレンタルサーバーの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のバージョン選択」を選ぶ。
右側のフォームで、PHP7.xを選択して「変更」実施
SSHで作業
SSHでログイン後、ビルドと公開用のフォルダ作成
% mkdir -p ~/usr/local/src
% mkdir -p ~/usr/local/php/extension
ICUのビルド
% 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をビルド
% 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を、拡張モジュール指定用のフォルダへコピー
% 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設定の編集」を選ぶ。
設定フォームに拡張フォルダと、ファイル名を指定して更新。
extension_dir = /home/さくらのユーザー名/usr/local/php/extension
extension=intl.so
(参考)phpinfo() で確認
参考サイト
さくらのレンタルサーバ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++かなんかが古いのかも)ので結構きびしいかも