Программисты делятся на два типа: консерваторы, для которых переход на новую версию равносилен перелёту на другую планету (если читаешь это из 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 можно на их официальном сайте. На данный момент (февраль 2018) последний релиз — 60.2.
Чтобы проверить, какую версию ICU использует php7.0-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Мягко говоря, не айс — версия 55.1 была выпущена в первой половине 2015-го, и с тех пор успела обновиться ещё 5 раз. Нужно же что-то делать!
version => 1.1.0
ICU version => 55.1
ICU Data version => 55.1
Решение
- Проверяем полное название расширения 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/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'
- Перезапускаем 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 => enabledP.S. Если у тебя есть англоязычные друзья и ты спешишь поделиться с ними радостной вестью, вот тебе версия на англицком из моего англоязычного блога.
version => 1.1.0
ICU version => 60.2
ICU Data version => 60.2