Edited at

さくらのレンタルサーバ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++かなんかが古いのかも)ので結構きびしいかも