26 октября 2014 года в 02:00 в большинстве регионов России состоится очередное изменение во времени: мы переходим на постоянное зимнее время (часы переводятся на час назад).
Если бы речь шла о наручных или настенных часах, то вся проблема свелась бы к ручному переводу стрелок. Так почему в компьютерах все сложно и требуются какие-то обновления? Или не требуются? Давайте разберемся.
Немного теории
В 2011 году по постановлению президента Медведева Россия перешла на постоянное летнее время, в результате чего Москва находится в часовом поясе GMT+4, а Екатеринбург в GMT+6. Что это за цифры? Вы наверняка знаете, что наш земной шар делится на условные временные зоны. Нулевой меридиан, проходящий через английский город Гринвич, имеет нулевую временную зону (GMT+0). Двигаясь на восток в сторону Японии временные зоны получают положительное смещение времени, то есть когда в Гринвиче полночь, в Москве 4 часа утра (GMT+4), а в Екатеринбурге 6 утра (GMT+6). Двигаясь от Гринвича на запад мы получаем отрицательное смещение времени, поэтому когда в Гринвиче полночь, в Нью-Йорке еще только 20 часов вечера предыдущего дня (GMT-4).
Большинство операционных систем для представления времени используют довольно простую схему: за начальную точку отсчета берется так называемое UNIX Epoch или 1 января 1970 года 00 часов по Гринвичу. Любое другое время внутри компьютера представлено в виде количества секунд, прошедшего с момента UNIX Epoch. Например, 23 октября 2014 года 00:00 по Гринвичу хранится как число 1414000800 - именно столько секунд прошло с момента UNIX Epoch. В итоге получается довольно простая арифметика: в сутках 24 часа, поэтому чтобы получить 00 часов 24 октября, нужно к 1414000800 прибавить 24*60*60=86400 секунд. Все просто, казалось бы. Но нет. Дело в том, что не в каждых сутках 24 часа. Поскольку 26 октября 2014 года мы должны перевести часы на час назад, между 00 часов 26 октября и 00 часов 27 октября в большинстве городов России всего 23 часа.
Для того, чтобы функции работы со временем могли учитывать переходы между летним и зимним временем, была разработана специальная база данных - timezone database (tzdata) или Olson database. В этой базе данных хранятся сведения о локальных переводах времени для различных территорий. Понятно, что между Гринвичем и GMT+6 всегда будет 6 часов разницы, но вот между Гринвичем и Екатеринбургом 25 октября 2014 года 6 часов разницы, а с 26 октября - 5 часов. То есть, 26 октября Екатеринбург “переезжает” из GMT+6 в GMT+5. Фактически же локальные временные зоны обозначаются не через смещение GMT, а имеют наименования типа Asia/Yekaterinburg или Europe/Moscow, поэтому правильнее для Екатеринбурга указывать временную зону именно так: Asia/Yekaterinburg.
Итак, теперь, когда вы освоили теорию, давайте ответим на вопрос: можно ли просто перевести часы в компьютере или на сервере. Возникает два варианта:
- Вы вручную меняете временную зону вашего сервера на GMT+5 (для Екатеринбурга). Тогда с 26 октября ваш сервер будет показывать правильное время. Но для всех предыдущих дат время будет смещено на час. Например, если у вас на сайте есть раздел с новостями и у вас в понедельник, 20 октября в 10 утра была опубликована какая-то новость, то после такого перевода часов эта новость будет отображаться как опубликованная в 9 утра. Почему? Вспомните что мы рассказывали по количество секунд, прошедшее с UNIX Epoch. Оно не изменилось, а вот смещение GMT стало другим. Является ли отображение времени у предыдущих дат для вас проблемой или нет - решать вам.
- Необходимо произвести обновление базы данных tzdata в вашей системе, чтобы в нем появилась запись о том, что правительство РФ решило перевести стрелки часов 26 октября 2014. Если это сделать, то тогда все временные отметки, сделанные как до 26 октября, так и после, будут иметь правильное время.
Если вы решили пойти по второму варианту и обновить tzdata, вам пригодится инструкция, представленная ниже. Если по какой-то причине она покажется вам сложной, наша тех.поддержка всегда готова прийти к вам на помощь.
Обновление системного tzdata
(Все приведенные ниже команды необходимо выполнять на вашем VDS от имени суперпользователя, либо добавлять sudo в начале команд.)
Для обновления пакета tzdata в свежих версиях Debian и Ubuntu необходимо выполнить:
apt-get update
apt-get install tzdata
Если у вас Debian squeeze (как это проверить описано в начале раздела Обновление php ниже), эта операционная система на данный момент устарела. Ее стандартные репозитории с июня этого года больше не обновляются. Но для архитектур IA-32 и x86-64 еще какое-то время будет обновляться репозиторий squeeze-lts. Если вы по каким-то причинам не можете перейти на актуальную версию операционной системы, но вам нужны обновления, вам следует добавить этот репозиторий:
grep -q 'squeeze-lts' /etc/apt/sources.list || echo "deb http://ftp.us.debian.org/debian squeeze-lts main non-free contrib" >> /etc/apt/sources.list
и выполнить:
apt-get update
apt-get -t squeeze-lts install tzdata
После обновления данного пакета, необходимо, чтобы об этих изменениях узнали все запущенные постоянно сервисы (или демоны), такие как cron, syslog, apache, nginx, mysql, postfix, dovecot и другие. Для этого их нужно перезапустить:
service имя_сервиса restart
Где вместо “имя сервиса” необходимо последовательно подставить имена перезагружаемых сервисов. Либо вы можете просто перезагрузить операционную систему командой
reboot
Обновление php
Язык программирования PHP с версии 5.1 использует свою собственную версию tzdata. Если у вас облачный VDS с предустановленной связкой LAMP (linux+apache+mysql+php) или связкой nginx + PHP, то у вас стоит PHP из стандартного debian-репозитория, в котором используется патч, принуждающий PHP использовать системную базу tzdata. В этом случае никаких дополнительных действий производить не нужно.
Если вы используете VDS с нашей панелью управления, то у вас установлены несколько версий php нашей сборки, в том числе те, которые не поддерживаются текущим дистрибутивом debian, по этому, эти пакеты используют встроенный в php tzdata.
Для начала надо определить, какая у вас версия ОС Debian, и какие версии php в ней установлены.
cat /etc/debian_version
Скорее всего, здесь будет присутствовать слово squeeze или wheezy, либо указан номер версии цифрами. Если первая цифра 6 - то это squeeze, если 7 - wheezy.
Запомним этот результат. Далее, проверим, что у вас прописан наш репозиторий. Если нет, пропишем. Выполните следующую команду:
grep '^deb http://noc.netangels.ru/debian' -R /etc/apt
были ли найдены какие-либо результаты? Результатом поиска может быть одна или несколько строк, либо ничего. Например, вы можете получить следующие строки:
/etc/apt/sources.list.d/netangels-wheezy.list:deb http://noc.netangels.ru/debian wheezy main
/etc/apt/sources.list.d/netangels-unstable.list:deb http://noc.netangels.ru/debian unstable main
Надо удостовериться, что в одной из строк результата после адреса указанного репозитория (“noc.netangels.ru/debian”) идет верное имя вашего дистрибутива, полученное на предыдущем шаге.
В случае, если такая строка не нашлась или если в результате поиска вообще ничего не было найдено, необходимо добавить нужный репозиторий в систему:
echo "deb http://noc.netangels.ru/debian wheezy main" > /etc/apt/sources.list.d/netangels.list
(Если у вас squeeze, а не wheezy, необходимо заменить в этой команде wheezy на squeeze.)
Обновим данные о содержимом репозитория
apt-get update
Далее узнаем, какие у вас установлены версии php. Команда
dpkg -l | grep php5 | awk '{print $2}'
выведет список версий php и их расширений. Версии ниже 5.1 нас не интересуют, т.к. с ними ничего делать не нужно (они используют системную tzdata). В результате выполнения этой команды у вас должен получиться список, аналогичный приведенному ниже (номера версий, их количество и список установленных расширений могут различаться)
php5.2.1
php5.2.17-apc
php5.2.17-eaccelerator
php5.2.17-ffmpeg
php5.2.17-geoip
php5.2.17-imagick
php5.2.17-memcache
php5.2.17-timezonedb
php5.2.17-xcache
php5.2.17-xdebug
php5.3.23
php5.3.23-apc
php5.3.23-dbase
php5.3.23-eaccelerator
php5.3.23-ffmpeg
php5.3.23-geoip
php5.3.23-imagick
php5.3.23-memcache
php5.3.23-xcache
php5.3.23-xdebug
php5.4.13
php5.4.13-apc
php5.4.13-dbase
php5.4.13-geoip
php5.4.13-imagick
php5.4.13-memcache
php5.4.13-xcache
php5.4.13-xdebug
Для версий с php5.1 по php5.5 нужно обратить внимание на их подверсии. В приведенном выше списке мы видим, что установлены версии php5.2, php5.3 и php5.4, а именно, подверсии php5.2.17, php5.3.23 и php5.4.13, а также расширения для этих версий.
На данный момент последними сборками являются следующие:
php5.1.6
php5.2.17
php5.3.29
php5.4.32
php5.5.16
Если у вас используются версии php5.1 и/или php5.2 и установлены именно эти сборки (php5.1.6 и php5.2.17), то для этих версий достаточно всего лишь обновить пакеты php5.1.6-timezonedb и php5.2.17-timezonedb
apt-get install php5.1.6-timezonedb php5.2.17-timezonedb
Если ваши установленные сборки отличаются от указанных выше, вам необходимо поставить последнюю сборку со всеми необходимыми вам расширениями (естественно, это нужно делать только для тех версий, которые у вас уже установлены. То есть, если у вас например не установлена версия 5.1, то нет необходимости обновлять эту версию).
apt-get install php5.1.6 php5.1.6-eaccelerator php5.1.6-timezonedb
apt-get install php5.2.17 php5.2.17-apc php5.2.17-eaccelerator php5.2.17-ffmpeg php5.2.17-geoip php5.2.17-imagick php5.2.17-memcache php5.2.17-timezonedb php5.2.17-xcache php5.2.17-xdebug
Для версий php5.3, php5,4, php5.5 актуальными сборками являются php5.3.29, php5.4.32 и php5.5.16. Если у вас стоят именно эти сборки, то достаточно лишь обновить пакеты php5.3.29 php5.4.32 php5.5.16 (здесь timezonedb не собрана в виде отдельного модуля, как для версий php5.1 и php5.2)
apt-get install php5.3.29 php5.4.32 php5.5.16
(ненужные версии следует убрать). Если же ваши сборки устарели, то необходимо установить последние сборки для нужных версий:
apt-get install php5.3.17 php5.3.17-apc php5.3.17-dbase php5.3.17-eaccelerator php5.3.17-ffmpeg php5.3.17-geoip php5.3.17-imagick php5.3.17-memcache php5.3.17-xcache php5.3.23 php5.3.23-apc php5.3.23-dbase php5.3.23-eaccelerator php5.3.23-ffmpeg php5.3.23-geoip php5.3.23-imagick php5.3.23-memcache php5.3.23-xcache php5.3.23-xdebug php5.3.28 php5.3.28-apc php5.3.28-dbase php5.3.28-eaccelerator php5.3.28-ffmpeg php5.3.28-geoip php5.3.28-imagick php5.3.28-memcache php5.3.28-xcache php5.3.28-xdebug php5.3.29 php5.3.29-apc php5.3.29-dbase php5.3.29-eaccelerator php5.3.29-ffmpeg php5.3.29-geoip php5.3.29-imagick php5.3.29-memcache php5.3.29-xcache php5.3.29-xdebug
apt-get install php5.4.13 php5.4.13-apc php5.4.13-dbase php5.4.13-geoip php5.4.13-imagick php5.4.13-memcache php5.4.13-xcache php5.4.13-xdebug php5.4.24 php5.4.24-apc php5.4.24-dbase php5.4.24-geoip php5.4.24-imagick php5.4.24-memcache php5.4.24-xcache php5.4.24-xdebug php5.4.32 php5.4.32-apc php5.4.32-dbase php5.4.32-geoip php5.4.32-imagick php5.4.32-memcache php5.4.32-xcache php5.4.32-xdebug php5.4.7 php5.4.7-apc php5.4.7-dbase php5.4.7-geoip php5.4.7-imagick php5.4.7-memcache php5.4.7-xcache
apt-get install php5.5.0 php5.5.0-dbase php5.5.0-geoip php5.5.0-imagick php5.5.0-memcache php5.5.0-xdebug php5.5.16 php5.5.16-dbase php5.5.16-geoip php5.5.16-imagick php5.5.16-memcache php5.5.16-xdebug php5.5.8 php5.5.8-dbase php5.5.8-geoip php5.5.8-imagick php5.5.8-memcache php5.5.8-xdebug
(нужно выполнить эту операцию только для нужных версий, а также, вы можете не устанавливать заведомо не нужные вам расширения просто убрав их из списка установки)
По окончании работ необходимо выполнить скрипт /usr/bin/update-php. Он настроит необходимые ссылки, чтобы если у вас в панели выбрана версия php5.3, она указывала именно на последнюю сборку этой версии php5.3.29, а не на более старые.