Pull to refresh

Обновляем расширение Intl в PHP 7 на Linux Ubuntu 16.04

Reading time 3 min
Views 25K
Программисты делятся на два типа: консерваторы, для которых переход на новую версию равносилен перелёту на другую планету (если читаешь это из Windows XP — поздравляю, это ты); и Викторы Цои, чьи сердца и глаза требуют перемен, и обновляют всё и вся при первой возможности. Если ты второго типа, и у тебя уже стоит последняя версия PHP на последней LTS версии Ubuntu, но покоя не даёт то, что расширение Intl использует устаревшую версию библиотеки ICU, или тебе просто понравились картинки из «Аватара» — добро пожаловать под кат! (Картинок больше не будет.)

Аватар


Ну и зачем это?


Библиотека ICU с каждым релизом добавляет поддержку стандартов транслитерации для различных языков, добавляет новые функции и возможности, фиксит баги. Пока неизвестно, по какой причине PHP нерегулярно обновляет ICU в расширении Intl. Поэтому приходится всё брать в свои руки.

Поиск решения


Быстрый поиск по гуглу не дал внятных решений. Детальный тоже. В общем и целом пэхэпэшным программистам по барабану, какую версию ICU использует Intl. Но только не нашим! Отчаявшись искать в англоязычном сегменте интернета, совершенно случайно набрёл на запись русского блогера Сергея Стоянова, где он объясняет процесс обновления ICU в PHP 5 для Ubuntu 14.04. В PHP 7 процесс сильно отличается, но общая последовательность действий остаётся такой же: удаляем Intl; собираем новую версию ICU; устанавливаем Intl, ткнув его носом, где искать ICU; включаем Intl в PHP; открываем шампанское. Также сильно помогли комментарии к статье (особенно комментарий Антона Минина и его shell скрипт).

Версии ICU


Проверить последнюю версию ICU можно на их официальном сайте. На данный момент (февраль 2018) последний релиз — 60.2.

Чтобы проверить, какую версию ICU использует php7.0-intl, напиши в терминале
php -i
и прокрути до списка установленных модулей. Найди там раздел, озаглавленный «intl». У меня там было:
Internationalization support => enabled
version => 1.1.0
ICU version => 55.1
ICU Data version => 55.1
Мягко говоря, не айс — версия 55.1 была выпущена в первой половине 2015-го, и с тех пор успела обновиться ещё 5 раз. Нужно же что-то делать!

Решение


  1. Проверяем полное название расширения Intl (для PHP 7 обычно это php7.0-intl):
    sudo dpkg --get-selections | grep -v deinstall | grep php
  2. Удаляем расширение Intl:
    sudo apt-get remove php7.0-intl
  3. Устанавливаем phpize:
    sudo apt install php7.0-dev
  4. Устанавливаем git (если его нет):
    sudo apt install git
  5. Устанавливаем icu-install.sh (в оригинальном скрипте было 2 ошибки, поэтому здесь использую мой форк):
    git -C /tmp clone https://gist.github.com/siffash/76676186de0ffc6eb6cbf89abc7a5e2f icu-install
  6. Разрешаем скрипту запускаться:
    sudo chmod +x /tmp/icu-install/icu-install.sh
  7. Проверяем доступные версии ICU:
    sudo /tmp/icu-install/icu-install.sh versions
  8. Выбираем последнюю (60.2) и запускаем установку:
    sudo /tmp/icu-install/icu-install.sh install 60.2
  9. Подключаем intl.so в php.ini:
    sudo touch /etc/php/7.0/cli/conf.d/20-intl.ini
    sudo bash -c 'echo "extension=intl.so" > /etc/php/7.0/cli/conf.d/20-intl.ini'
    sudo touch /etc/php/7.0/apache2/conf.d/20-intl.ini
    sudo bash -c 'echo "extension=intl.so" > /etc/php/7.0/apache2/conf.d/20-intl.ini'
  10. Перезапускаем Apache:
    /etc/init.d/apache2 restart
  11. Удаляем phpize:
    sudo apt-get purge --auto-remove php7.0-dev
  12. Удаляем shell скрипт:
    rm -rf /tmp/icu-install

Теперь проверяем версию ICU в
php -i
и прыгаем до потолка:
Internationalization support => enabled
version => 1.1.0
ICU version => 60.2
ICU Data version => 60.2
P.S. Если у тебя есть англоязычные друзья и ты спешишь поделиться с ними радостной вестью, вот тебе версия на англицком из моего англоязычного блога.
Tags:
Hubs:
+16
Comments 12
Comments Comments 12

Articles