Обновляем расширение 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 раз. Нужно же что-то делать!
Решение
- Проверяем полное название расширения Intl (для PHP 7 обычно это php7.0-intl):
sudo dpkg --get-selections | grep -v deinstall | grep php
- Удаляем расширение Intl:
sudo apt-get remove php7.0-intl
- Устанавливаем phpize:
sudo apt install php7.0-dev
- Устанавливаем git (если его нет):
sudo apt install git
- Устанавливаем icu-install.sh (в оригинальном скрипте было 2 ошибки, поэтому здесь использую мой форк):
git -C /tmp clone https://gist.github.com/siffash/76676186de0ffc6eb6cbf89abc7a5e2f icu-install
- Разрешаем скрипту запускаться:
sudo chmod +x /tmp/icu-install/icu-install.sh
- Проверяем доступные версии ICU:
sudo /tmp/icu-install/icu-install.sh versions
- Выбираем последнюю (60.2) и запускаем установку:
sudo /tmp/icu-install/icu-install.sh install 60.2
- Подключаем 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'
- Перезапускаем Apache:
/etc/init.d/apache2 restart
- Удаляем phpize:
sudo apt-get purge --auto-remove php7.0-dev
- Удаляем 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. Если у тебя есть англоязычные друзья и ты спешишь поделиться с ними радостной вестью, вот тебе версия на англицком из моего англоязычного блога.