Когда требуется выполнить синхронизацию с внешним источником данных (например, с 1С), то 1С Битрикс может выдать следующую ошибку: «Время на сервере базы данных отличается от времени на веб-сервере больше, чем на 10 минут». Это означает, что необходимо проверить и настроить правильные временные зоны.
Разберем эту проблему детальнее. Можно выполнить простой фикс (грабли) в виде хука в файле /bitrix/php_interface/after_connect_d7.php
указать принудительно:
$connection->queryExecute("SET LOCAL time_zone='".date('P')."'");
Но мы рекомендуем разобраться детально в причинах проблемы, для этого подключитесь к серверу по SSH и проверьте командой ‘date’ время в операционной системе (здесь и далее мы работаем в CentOS 7.
В консоли мы сначала забекапим временные файлы:
[root@sx ~]# mv /etc/localtime /etc/localtime-backup
потом делаем линк на нужную нам часовую зону:
[root@sx ~]# ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime
И далее проверяем командой ‘date’ корректность нового времени.
Вот как это выглядит в терминале:
[root@sx ~]# mv /etc/localtime /etc/localtime-backup [root@sx ~]# date Wed Apr 8 17:19:38 UTC 2020 [root@sx ~]# ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime [root@sx ~]# date Wed Apr 8 20:19:46 MSK 2020
Далее подключаемся в MySQL / MariaDB и проверяем тайм-зону командой:
select current_timestamp;
В консоли это выглядит так:
[root@sx ~]# mysql Welcome to the MariaDB monitor. Commands end with ; or g. Your MariaDB connection id is 104506 Server version: 5.5.64-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. MariaDB [(none)]> select current_timestamp; +---------------------+ | current_timestamp | +---------------------+ | 2020-04-08 20:24:41 | +---------------------+ 1 row in set (0.00 sec) MariaDB [(none)]>
Если в MySQL / MariaDB неверное время, то выполняем следующее по определению default_time_zone: идем в /etc/my.cnf (CentOS) или /etc/mysql/my.cnf (Ubuntu) и после:
[root@sx ~] sudo /etc/init.d/mysqld restart
Сложные случаи конфликта во времени в SysConfig
Иногда так происходит, что еще одна отсылка ко времени сервера есть в:
/etc/sysconfig/clock
Вы можете поменять тайм-зону через ‘tzselect’, а в SysConfig, например, может быть прописано: ZONE=America/New_York
Это решается достаточно просто:
[root@sx ~]# vim /etc/sysconfig/clock ZONE="Europe/Moscow" UTC=true ARC=false
Временные зоны в PHP
Сейчас переходим к PHP, здесь тоже может быть нюанс, поэтому смотрим: /etc/php.ini
(из него билдится уже /etc/php.d/bitrixenv.ini) в ini-файле корректируем или добавляем:
timezone = Europe/Moscow
После изменений в php.ini нужно рестартнуть Апач:
service httpd restart
Просмотров: 16556
Достаточно часто, при проверке параметров системы, в Битрикс, можно увидеть одну из ошибок: Время на БД и на сервере- Время отличается на 3600 секунд (цифра может быть разная, но чаще всего именно эта). Ошибка возникает, как правило, при установке веб окружения битрикс на VPS/VDS. Все из-за неправильных настроек временной зоны. Расскажу как исправить.
Провести тест, можно из административной панели битрикс, находится по пути: Администрирование-> Настройки-> Инструменты-> Проверка системы.
Так же, данную ошибку можно увидеть в модуле обмена с сайтом на стороне 1С. При попытке обмена вам может выдать ошибку «Авторизация не пройдена«- даже если уверены, что правильно внесли адрес сайта, логин пользователя с правом обмена и его пароль, а проверка подключения все равно не проходит- скорее всего у вас именно эта ошибка времени на БД и на веб сервере.
Есть два способа решения ошибки
Не очень правильный: Открыть на редактирование файл /bitrix/php_interface/after_connect_d7.php и внести в него строчку.
$connection->queryExecute("SET LOCAL time_zone='".date('P')."'");
После этого, чаще всего, ошибка исчезает и даже 1С проходит проверку авторизации. Но редко, бывает, что не срабатывает для 1С (хотя тест на стороне сайта покажет что все нормально). Есть правильный способ
Подключаемся к серверу по SFTP/FTP протоколу, открываем файл по пути /etc/php.ini (да, именно его, а не /etc/php.d/bitrixenv.ini). И вносим строчку
timezone = Europe/Moscow
Перезагружаем Apache командой
service httpd restart
Все, после этого и ошибка пропадет и 1С сконнектится с сайтом.
Дополнено: Смена часового пояса на уровне системы в CentOS
Предыдуший способ менят часовой пояс на уровне php. Можно сделать совсем правильно и гарантировано работоспособно: сменить часовой пояс в самой системе CentOS
Открываем терминал и вводим команды
- mv /etc/localtime /etc/localtime-old — бекапим файл часовых зон
- ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime — делаем ссылку на часовую зону
- date — убеждаемся что время правильное, выдаст текущую дату и время
PS: Само собой, если у вас 1С и сервер с сайтом работают в другом часовом поясе- выставляйте свой вместо Europe/Moscow
Мои видео на Boosty:
Ваш баннер вместо этой рекламы: 15 000 руб/мес. Размещается во всем блоге, форуме, видеоуроках и разделе с макетами.
Ошибка обмена с 1С: «Время на сервере базы данных отличается от времени на веб-сервере больше, чем на 10 минут»
При обмене магазина на 1С-Битрикс с 1С Управление торговлей 11 (УТ 11) можно получить следующую ошибку:
Ответ сервера: failure Время на сервере базы данных отличается от времени на веб-сервере больше, чем на 10 минут. Вероятно неправильно настроены временные зоны. Выполните настройку и повторите обмен.
Это означает, что время PHP на хостинге или виртуальном сервере отличается от времени на компьютере где установлена 1С УТ 11.
Поправить это очень просто, достаточно в файле настроек PHP:
/bitrix/php_interface/dbconn.php
вписать строку:
date_default_timezone_set(«Etc/GMT-4»);
(«Etc/GMT-4») — это часовой пояс Москвы, если у вас другой часовой пояс можно просто рассчитать от московского. Например для Новосибирска будет:
date_default_timezone_set(«Etc/GMT-6»);
Вот так легко вы избавитесь от ошибки «Время на сервере базы данных отличается от времени на веб-сервере больше, чем на 10 минут».
Количество показов: 9300
Возврат к списку
Материал из Wiki — Iphoster — the best ever hosting and support. 2005 — 2023
Перейти к:навигация, поиск
Ошибка при проверке:
Время на БД и веб-сервере Ошибка! Время отличается на 7200 секунд
1) Подкорректировать время на сервере и для php на MSK:
CentOS_-_устанавливаем_временную_зону_date.timezone_для_сервера_и_скриптов
2) Добавить в файл bitrix/php_interface/dbconn.php строку
date_default_timezone_set("Etc/GMT+3");
Добавить в файл bitrix/php_interface/after_connect_d7.php строки
<? $connection = BitrixMainApplication::getConnection(); $connection->queryExecute("SET NAMES 'cp1251'"); $connection->queryExecute("SET LOCAL time_zone='".date('P')."'"); ?>
Добавить в файл bitrix/php_interface/after_connect.php строки
<? $DB->Query("SET NAMES 'cp1251'"); $DB->Query("SET LOCAL time_zone='".date('P')."'"); ?>
несколько удваивая ответ @clemens с образцами …
в соответствии с вашим часовым поясом:
t=# set timezone to 'GMT+6';
SET
что ты делаешь:
t=# with c("ct", last_gps_read) as (values('2018-03-21 23:26:07.263931-06'::timestamptz,'2018-03-21 23:26:00.5273'::timestamp))
select ct
, extract(EPOCH from ct)
, last_gps_read
, extract(EPOCH from ct) - extract(EPOCH from last_gps_read)
from c;
ct | date_part | last_gps_read | ?column?
-------------------------------+------------------+--------------------------+-----------------
2018-03-21 23:26:07.263931-06 | 1521696367.26393 | 2018-03-21 23:26:00.5273 | 21606.736631155
(1 row)
что ты должен делать:
t=# with c("ct", last_gps_read) as (values('2018-03-21 23:26:07.263931-06'::timestamptz,'2018-03-21 23:26:00.5273'::timestamp))
select ct
, extract(EPOCH from ct)
, last_gps_read
, extract(EPOCH from ct - last_gps_read)
from c;
ct | date_part | last_gps_read | date_part
-------------------------------+------------------+--------------------------+-----------
2018-03-21 23:26:07.263931-06 | 1521696367.26393 | 2018-03-21 23:26:00.5273 | 6.736631
(1 row)
почему: вы отделяете double precision
от double precision
и получаете epoch aware of time zone
— epoch not aware of timezone
. Так что ваш результат ожидаем. И задокументированный. Я предлагаю использовать interval
для разделения по временным меткам, независимо от того, известен часовой пояс или нет (так как интервал работает в обоих случаях), а ЗАТЕМ извлекать эпоху из interval
. Таким образом, вам не нужно настраивать часовой пояс или унифицировать метку времени с часовым поясом для AT TIME ZONE 'GTM'
или чего-то еще …