Недавно столкнулся с такой проблемой: после переноса проекта с сервера (Debian) на другой сервер (CentOS) начало отставать время на час. Все возможные проверки часовых поясов (в системе, PHP,SQL) не дали результатов, там время стояло корректно, а вот функции внутри PHP отдавали текущее время на час меньше, чем должно быть.
Поэтому, если у вас отстает время на час назад и не можете с этим ничего сделать или не знаете как обновить библиотеку ICU и модуль PHP intl, использующий ее — прошу в полную новость, где я расскажу как обновить библиотеку ICU и PHP intl в CentOS 7/Ubuntu/Debian
Как оказалось — проблема эта давно известна (с момента отмены в России перехода на летнее время) и давно уже исправлена в актуальных версиях библиотеки, но не все операционные системы предлагают ее для обновления, а модули PHP (в частности intl, которое отвечает за интернационализацию) вообще используют старую версию, на которой модуль был собран.
В результате долгих поисков был найден скрипт (Автор: Anton Minin (aminin)), скрипт позволяет просмотреть список версий ICU, а также собрать из исходников и установить в систему как саму ICU, так и расширение PHP intl. Я немного адаптировал данный скрипт для поддержки сборки на других ОС (изначально скрипт был для Debian/Ubuntu, но теперь собирается и на CentOS 7). Загрузить его можно здесь
При использовании оригинального скрипта вам нужно:
- Загрузить скрипт себе (любым из способов)
- Выполнить команду bash icu_install.sh versions (где заменить icu_install.sh на имя, под которым вы сохранили скрипт). В результате вам будет показан актуальный список версий ICU
- Выполнить команду bash icu_install.sh install <номер версии>, например bash icu_install.sh install 60.2
- Система предложит удалить модуль php-intl, если он установлен и повторить установку.
- Остается только дождаться установки.
К сожалению оригинальный скрипт мне не подходил т.к. по тем путям, которые лежат файлы PHP в Debian/Ubuntu в CentOS 7 ничего нет, поэтому скрипт был немного модифицирован и необходимые данные вынесены в переменные.
Так при использовании моей модификации скрипта вам нужно:
- Загрузить скрипт себе (любым из способов)
- Указать значения переменных в начале скрипта
- Выполнить пункты 2,3,4,5 из списка выше
Единственное, что не изменено в моей версии скрипта — автоустановка конфигурации для загрузки т.к. тут каталоги разнятся в зависимости от системы и желаний администратора. Поэтому после сборки на CentOS7 нужно вручную скопировать файл 20-intl.ini с содержимым extension=intl.so в директорию php.d (для CentOS7 и PHP из Remi это /etc/opt/<версия PHP>/php.d
Для CentOS 7 и установленного PHP 7.0 корректно установилась 60.2, версии выше не захотели ставиться, для PHP 7.1 — спокойно установилась последняя версия.
Спасибо автору оригинального скрипта, очень помогло.