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

Программисты делятся на два типа: консерваторы, для которых переход на новую версию равносилен перелёту на другую планету (если читаешь это из Windows XP — поздравляю, это ты); и Викторы Цои, чьи сердца и глаза требуют перемен, и обновляют всё и вся при первой возможности. Если ты второго типа, и у тебя уже стоит последняя версия PHP на последней версии 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/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. Если у тебя есть англоязычные друзья и ты спешишь поделиться с ними радостной вестью, вот тебе версия на англицком из моего англоязычного блога.

© Habrahabr.ru