Последний раз, я думал, что править в PHP timezone мне придется только в 2012 году. Однако, на самом деле реалии оказались более жесткими.
В октябре 2014 года в РФ время в очередной раз передвинули на GMT+3, и пришлось вспоминать как исправлялась база часовых поясов в далеком 2012 году. Следует отметить, что многие дистрибутивы Linux содержат сборку PHP с привязкой к OS TZ и там, при своевременном апдейте системной базы часовых поясов этой проблемы не возникает. Так же во многих дистрибутивах можно просто собрать необходимую, обновленную, базу через стандартный pecl механизм в PHP:
но в нашем случае это не принесло желаемого результата из-за множественных ошибок вызванных неординарной настройкой в системе.
Из-за чего весь этот сыр-бор?
В UNIX like системах существует как минимум две независимые базы часовых поясов – одна операционной системы, другая в Java. Что заставило PHP разработчиков делать свою отдельную базу часовых поясов – не ведомо, но с версии 5.1 она присутствует в виде отдельного пакета timezonedb. При изменении часовых правил в РФ мы получаем рассогласование между временем в ОС и временем внутри PHP скриптов. Чтобы проверить это расхождение достаточно на Web-сервере запустить следующий скрипт:
Конечно, если это исполнять до времени Ч, то эффект не будет заметен, поэтому надо перевести будет дату на сервере уже за оное время Ч
и исполнить его еще раз. Будет видно, что консольное время ОС
отличается от времени PHP-скриптов, несмотря на то, что даже
перезагружали Apache. Что же делать?
Пересобираем PHP timezonedb под Solaris
Описанная ниже методика справедлива не только для ОС Solaris. Просто под другие ОС эта процедура может быть исполнена одной командой, и вот если, по какой-то причине, собрать через pecl не вышло, то можно действовать уже по данной методике.Берем исходник
Взять исходник можно по адресу: PECL package. Берем последнюю, стабильную версию. Скорее всего она уже будет содержать необходимые нам изменения в базе зон.Альтернативный процесс сборки под Solaris
Тут специально, для примера, приводятся не стандартные пути сборки для 64-bit PHP под ОС Solaris. Случаи могут быть разные...- Создаем каталог в котором будем разворачивать наш дистрибутив зон:
- Копируем в этот каталог взятый свежий PECL пакет timezonedb
- Распаковываем архив:
- Переходим в одноименный каталог:
cd timezonedb-2014.10 - Исполняем следующую стандартную команду из пакета PHP:
Если возникла ошибка: Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this script.Определяем переменные окружения:
export PHP_AUTOCONF=/usr/local/bin/autoconf
export PHP_AUTOHEADER=/usr/local/bin/autoheader
- Затем делаем конфигурацию, при которой создаться необходимое дерево каталогов (-m64 это чтобы собрать ELF64 файл, а не ELF32 по-умолчанию):
Если возникла ошибка: configure: error: no acceptable C compiler found in $PATH.
Определяем переменные окружения:
export PATH=$PATH:/usr/sfw/bin
- Когда преконфигурирование завершится, выполняем:
- Старую библиотеку базы временных зон, на всякий случай переименовываем:
- Копируем новую библиотеку на место старой:
- Не забываем в php.ini указать:
- Перезапускаем Apache server через svcadm.
Конечно, метод не лишен недостатков, но позволяет относительно быстро поправить убегание временной зоны на нестандартных инсталляциях PHP.
Комментариев нет:
Отправить комментарий