さくらのレンタルサーバ
PHP7
intl

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

More than 1 year has passed since last update.

概要

さくらのレンタルサーバーの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

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

php_version_select.PNG

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設定の編集」を選ぶ。

PHP_version_menu.PNG

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

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

php_ini.PNG

(参考)phpinfo() で確認

intl.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++かなんかが古いのかも)ので結構きびしいかも