Ну и зачем это?
Библиотека 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/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
Комментарии (9)
OnYourLips
10.02.2018 10:36+1Хочу обратить внимание на php.net/supported-versions.php
Рекомендую держать версию PHP в зеленой зоне.
Если бы вы это делали и периодически обновляли PHP на минорные релизы и постоянно на патч-релизы, то не столкнулись бы с проблемой.
Однако это подходит лишь для живых проектов. Мертвые (с завершенной стадией поддержки) просто так не выйдет перевести на новую версию.siffash Автор
10.02.2018 17:53При апргрейде PHP на 7.2 (которого, кстати, ещё нет в официальном репозитории Убунту) крашнулся весь проект, который, по всей видимости, был написан под 7.0. Мне же для добавления определённых фич (с использованием новых возможностей последнего релиза ICU) необходим был точечный апгрейд именно Intl.
OnYourLips
10.02.2018 18:54Надо обдуманно обновлять: переключить версию на локальной копии, запустить тесты, а потом уже думать о продакшене. Причем и продакшен лучше переключать частями: например 10% трафика пустить на новую версию и смотреть на мониторинг.
sumanai
Впервые ко мне обращаются из топика на Хабре.
siffash Автор
Боюсь спрашивать, каким браузером пользуетесь.
sumanai
Последний Basilisk на основе 55 FireFox, в 64 битной редакции. Всё равно более новые редакции этого браузера не поддерживают и пятой части нужных мне дополнений, так что я его поставлю даже на десятку.