Обновление ICU на CentOS/Red Hat/Fedora

yii2 formatter icu

Столкнулся с проблемой, при выводе времени, yii\i18n\Formatter формирует для зоны ‘Europe/Moscow’ время, соответствующее GMT+4:

$timeZone = 'UTC'
Yii::$app->formatter->timeZone = $timeZone;
echo $timeZone . ': ' . Yii::$app->formatter->asTime(time()) . '<br>';
$timeZone = 'Europe/Moscow'
Yii::$app->formatter->timeZone = $timeZone;
echo $timeZone . ': ' . Yii::$app->formatter->asTime(time()) . '<br>';

выводил :

UTC: 6:54:39
Europe/Moscow: 10:54:39

В конфиге приложения временная зона указана явно: ‘timeZone’ => ‘Asia/Omsk’.

Выяснилось, что все дело в устаревшей, двухлетней давности библиотеке ICU версии 52.1. Версия PHP актуальная, на данный момент: 5.6.13.

Узнать установленные версии PHP и ICU можно при помощи простого скрипта:

<?php
echo "PHP: " . PHP_VERSION . "<br>\n";
echo "ICU: " . INTL_ICU_VERSION . "<br>\n";

За отсутствием в репозиториях свежей версии ICU, знающей обо всех последних манипуляциях с часовыми поясами и летним/зимним временем, пришлось собрать из исходников ICU 55.1 и установить свежее pecl расширение intl.

Плацдарм: Fedora 21 x64 Server.

Подготовка

Первым делом удалим php-intl и установим нужные инструменты

yum remove -y php-intl
yum install -y gcc gcc-c++.x86_64 php-devel php-pear

Скачиваем и распаковываем исходники ICU

wget http://download.icu-project.org/files/icu4c/55.1/icu4c-55_1-src.tgz
tar zxvf icu4c-55_1-src.tgz

Сборка и установка

Собираем и устанавливаем ICU в указанный путь

cd icu/source
./configure --prefix=/opt/icu5c && make && make install

Устанавливаем расширение intl

pecl install intl

На запрос Specify where ICU libraries and headers can be found [DEFAULT] :, укажем путь к новому ICU: /opt/icu5c.

После успешного завершения установки, обращаем внимание на рекомендацию подключения нового расширения:

You should add «extension=intl.so» to php.ini

Добавляем строку extension=intl.so  в файл /etc/php.ini  и перезапускаем веб-сервер: systemctl restart httpd.

Проверяем результат

Проверяем установленные версии PHP и ICU

PHP: 5.6.13
ICU: 55.1

Проверяем формирование даты компонентом yii2 formatter

UTC: 7:32:03
Europe/Moscow: 10:32:03

В итоге мы получили свежую версию библиотеки ICU и адекватную работу крутого php-фреймворка Yii 2.0.

3 thoughts on “Обновление ICU на CentOS/Red Hat/Fedora

    1. nix Автор записи

      Примерно так же и будет. Нет убунты под рукой для проверки.
      cd source &&
      ./configure --prefix=/usr &&
      make &&
      make install

      или что-то не собирается?

  1. Djack

    Подскажите, на CentOS 7, после команды
    pecl install intl
    получаю ошибку:

    running: make
    /bin/sh /var/tmp/pear-build-rootc2tZHu/intl-3.0.0/libtool —mode=compile cc -I/opt/icu5c/include -Wno-write-strings -I. -I/var/tmp/intl -DPHP_ATOM_INC -I/var/tmp/pear-build-rootc2tZHu/intl-3.0.0/include -I/var/tmp/pear-build-rootc2tZHu/intl-3.0.0/main -I/var/tmp/intl -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib -I/opt/icu5c/include -DHAVE_CONFIG_H -g -O2 -c /var/tmp/intl/php_intl.c -o php_intl.lo
    libtool: compile: cc -I/opt/icu5c/include -Wno-write-strings -I. -I/var/tmp/intl -DPHP_ATOM_INC -I/var/tmp/pear-build-rootc2tZHu/intl-3.0.0/include -I/var/tmp/pear-build-rootc2tZHu/intl-3.0.0/main -I/var/tmp/intl -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib -I/opt/icu5c/include -DHAVE_CONFIG_H -g -O2 -c /var/tmp/intl/php_intl.c -fPIC -DPIC -o .libs/php_intl.o
    In file included from /var/tmp/intl/php_intl.h:34:0,
    from /var/tmp/intl/php_intl.c:25:
    /var/tmp/intl/intl_error.h:24:40: fatal error: ext/standard/php_smart_str.h: No such file or directory
    #include
    ^
    compilation terminated.
    make: *** [php_intl.lo] Error 1
    ERROR: `make’ failed

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *