Yii2. Согласование временных зон между MySQL и PHP

Часто на хостингах встречается проблема, что время в БД MySQL отличается от серверного. Это приводит к тому, что вызов функции типа NOW(), CURRENT_TIME() или CURRENT_TIMESTAMP() будут возвращать «неправильные» значения и будет расхождение времени между БД MySQL и сервером.

Чтобы проверить текущую временную зону MySQL, нужно выполнить запрос:

SHOW VARIABLES LIKE '%zone%';SELECT @@global.time_zone, @@session.time_zone;

Чтобы посмотреть текущее время сервера БД:

SELECT CURRENT_TIME();

Для того что бы нам синхронизировать серверное время и время в базе данных, нам надо непосредственно указать временную зону для нее, используя запрос вида: SET time_zone=»UTC» или SET time_zone=»+03:00″, в котором мы указываем нужную нам временную зону. Но запрос нужно посылать каждый раз когда вы подключаетесь к базе данных.

В Yii2 есть компонент DB который отвечает за подключение к БД и в нем есть событие «afterOpen» которое вызывается после подключения к БД. В обработчике этого события мы как раз и можем выполнить наш запрос который установит значение временной зоны. См. пример конфигурации компонента:

return [  'components' => [    'db' => [        ...        'on afterOpen' => function($event) {             $event->sender->createCommand("SET time_zone='Europe/Moscow';")->execute();        },        ...    ],  ]];

Вопросы и ответы

Q: Что делать если получается MySQL ошибка вида Unknown or incorrect time zone: ‘Europe/Moscow’ !?
A: Нужно создать базу timezone в MySql сервере выполнив в консоли:

mysql_tzinfo_to_sql/usr/share/zoneinfo|mysql -u root mysql -p
admin

Recent Posts

Настройка Mercurial по HTTPS

Иногда mercurial, при скачивании и комитах ругается на https. Особенно на самоподписанные сертификаты. Чтобы заработал…

3 недели ago

Компиляция libvirt в Ubuntu

Компиляция libvirt Подробнее

3 недели ago

Ошибка libvirt permission denied: решение

Если возникает ошибка libvirt destroy lxc permission denied , при попытке остановить контейнер: _x000D_# virsh…

3 недели ago

Настройка редиректа в NGINX

Файлы с примерами редиректа для nginx Подробнее

3 недели ago

Включение gzip в NGINX

Как включить gzip сжатие в Nginx ? Подробнее

3 недели ago

Удаление postinst-скрипта в Linux

Иногда возникает ситуация, когда криво настроенные пакеты не устанавливаются в системе. У меня это произошло…

3 недели ago