- PVSM.RU - https://www.pvsm.ru -
Доброе %время суток%.
Ничего не предвещало беды. Задолго до были обновлены tzdata и всё, до чего могли руки дотянуться. Но в очередной момент перевода часов мой сайт стал выдавать московское время на час больше. Беглая проверка показала, что сама OS, mysql и php (функция date) возвращают время корректно и указывают часовой пояс +3 для Москвы. Собака же зарыта оказалась в хорошем расширении php5-intl. Функция format класса IntlDateFormatter упорно возвращала часовой пояс +4 для Москвы.
В начале гугл не хотел мне помогать… но вскоре я узнал о таком звере, как icu [1] и еще одной базе временных зон, которые, как ни странно, так и не были обновлены в моей системе. И всё бы хорошо… apt-get update… apt-get upgrade… и… отсутствие обновления для libicu фиг знает сколько времени. Даже хорошие люди баг [2] завели в Debian по этому поводу. Но воз и ныне там. Гугл упорно ничего хорошего не советовал. Всё упиралось в ручную сборку свежей версии. Этот вариант даже был скромно освещен на хабре [3]. Я, как человек далекий от мира Linux, чуть было не угробил систему в попытках что либо собрать. В итоге, с помощью хорошего друга lsh [4] и совместного усиленного гугления мы нашли простой способ обновить данные для libicu не прибегая к компиляции или другим шаманствам.
Оказалось, что libicu, будучи даже скомпилированной с прямым включением данных таймзон и т.д. внутрь .so, оставляет возможность подсунуть свежую их версию через указания папки, откуда она могла бы их взять. Делается это через переменную окружения ICU_DATA. Найдя все кусочки пазла и пройдя пару неудачных попыток появилось простое и готовое к употреблению решение:
ICU_DATA=/opt/icu/
env[ICU_DATA]=/opt/icu/
И, нет, я не ошибся разместив файлы в icu/icudt48l/ а в путях указав только папку icu. Всё дело в том, что libicu сам подставляет к пути ICU_DATA папку исходя из своей версии (зачем?!). Так что, в будущем, при обновлении libicu, папку придется переименовать в другое имя.
Перезапуск php-pfm и… профит ) теперь можно смело убрать костыль с подстановкой вместо Europe/Moscow таймзону Europe/Minsk :)
Кстати, вопрос, почему php-fpm игнорирует глобальный env? Если кто найдет способ указать глобально для всех деток php-fpm данную настройку, тому большое человеческое спасибо.
Как ни странно, но этот простой способ было сложно нагуглить. Я, как и многие до меня, столкнувшись с этой проблемой, пытались пересобирать, вытаскивать из свежих тестовых сборок дистрибутивов и много еще чего. И что еще более странно, так это то, что данный способ только мельком упоминается на сайте самих icu [6]. Надеюсь я закрыл для вас этот вопрос.
Спасибо и безбажного вам кодинга!
Автор: Mear
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/php-2/87812
Ссылки в тексте:
[1] icu: http://site.icu-project.org/
[2] баг: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=771136
[3] хабре: http://habrahabr.ru/post/241447/
[4] lsh: http://habrahabr.ru/users/lsh/
[5] ссылке: http://source.icu-project.org/repos/icu/data/trunk/tzdata/icunew/2015b/44/le/
[6] только мельком упоминается на сайте самих icu: http://userguide.icu-project.org/icudata
[7] Источник: http://habrahabr.ru/post/254789/
Нажмите здесь для печати.