Иногда схема переходов на летнее/зимнее время меняется. База данных поставляется в виде пакета tzdata.noarch. Если на сервере установлена актуальная версия ОС, можно обновить этот пакет средствами установленного пакетного менеджера:
CentOS:
yum update tzdata
service httpd restart
Debian:
apt-get upgrade tzdata
/etc/init.d/apache2 restart
Если на сервере устаревшая версия ОС, обновить базу данных часовых поясов можно вручную.
Скачаем последнюю версию tzdata с сайта IANA http://www.iana.org/time-zones:
mkdir -p /usr/local/src/tzdata
cd /usr/local/src/tzdata
wget http://www.iana.org/time-zones/repository/releases/tzcode2011i.tar.gz
Распакуем его:
tar xzf tzcode2011i.tar.gz
rm tzcode2011i.tar.gz
И обновим базу данных, например, европы:
zic europe
Остается сделать симлинк файла нужного пояса в /etc/localtime:
cp -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime
И перезапустить все зависимые сервисы или сервер целиком:
Сервисы: for SERVICE in `chkconfig -list | grep 3:on | awk {'print $1'}`; do service $SERVICE restart; done
Сервер: shutdown -r -t 0 now
Обновление часового пояса для PHP
У PHP своя, встроенная база часовых поясов, которую тоже нужно обновить.
Если в системе есть PECL, то делаем так:
pecl install timezonedb
Установленный в системе PECL - скорее исключение, чем правило. Если PECL отсутствует:
- Выясняем, куда установлен PHP:
find / -type f -name php 2>/dev/null
/usr/local/zend/bin/php
В нашем случае PHP был установлен в префикс /usr/local/zend/ (это была хостинговая среда на базе чужих конфигов, но с похожей структурой, так будет даже нагляднее).
- Получаем пакет timezonedb с сайта PECL http://pecl.php.net/package/timezonedb:
cd /usr/local/src
wget http://pecl.php.net/get/timezonedb-2011.14.tgz
tar xzf timezonedb-2011.14.tgz
cd timezonedb-2011.14
- Генерируем конфигурационный скрипт и собираем модуль:
/usr/local/zend/bin/phpize
./configure -with-php-config=/usr/local/zend/bin/php-config
make
make install
Команда make install автоматически скопирует его в каталог с расширениями php.
- Прописываем модуль в конфигурационный файл PHP:
echo 'extension = timezonedb.so' > /usr/local/zend/etc/php.ini
- Перезапускаем PHP-зависимые сервисы, в нашем случае они управляются одним init-скриптом:
/etc/init.d/zend-server restart
Для проверки можно посмотреть в графу "Olson" Timezone Database Version в phpinfo:
/usr/local/zend/bin/php -i | grep Olson
"Olson" Timezone Database Version ? 2011.14
Номер версии должен совпасть с номером версии установленного нами пакета timezonedb:
ll /usr/local/src/timezone*tgz
-rw-r-r- 1 root root 193528 Nov 2 15:00 /usr/local/src/timezonedb-2011.14.tgz |