Помимо основной базы системных часовых поясов на сервере, некоторые веб-службы, такие как php, используют свои собственные часовые пояса. В итоге можно наблюдать картину, когда время в php-скриптах отстаёт или опережает системное.
# php -r 'printf("PHP Time:"); date_default_timezone_set("Europe/Moscow"); echo "\n".date ( "d.m.Y H:i" ) ."\n" ;'
PHP Time: 19.11.2014 18:53
# echo "System Time: " ; date "+%d.%m.%Y %H:%M"
System Time: 19.11.2014 17:53
Как видим, системное время и время php различаются. Чтобы этого избежать, помимо обновления системных часовых поясов, требуется отдельно обновлять timezone (zoneinfo) для серверных приложений php (mysql, postgresql, java и т.п.).
Если на сервере присутствует утилита pecl, обновление часовых поясов проще простого. Проверяем, установлен ли модуль timezonedb.
# php -m | grep timezonedb
timezonedb
Вывод не пустой, значит установлен, обновляем.
# pecl upgrade timezonedb
Если же модуль php timezonedb не был установлен, установим его.
# pecl install timezonedb
# echo "extension=timezonedb.so" >> /usr/local/etc/php/extensions.ini
Проверяем теперь соответствие между системным временем и временем интерпретатора php.
# php -r 'printf("PHP Time:"); date_default_timezone_set("Europe/Moscow"); echo "\n".date ( "d.m.Y H:i" ) ."\n" ;'
PHP Time: 19.11.2014 18:44
# echo "System Time: " ; date "+%d.%m.%Y %H:%M"
System Time: 19.11.2014 18:44
Время системное и время интерпретатора совпадает! Не забываем перезапустить службу, из-под которой запущен обработчик php (apache, php-fpm или др.).
# /usr/local/etc/rc.d/apache22 restart # /usr/local/etc/rc.d/php-fpm restart
Profit!
Если же на сервере отсутствует утилита pecl и машинка сама по себе имеет устаревшую версию FreeBSD, как выход - можно осуществить ручное обновление модуля timezonedb. Создаём директорию для временных файлов, скачиваем последнюю версию timezonedb из официального источника.
# mkdir /tmp/phpzoneinfo && cd /tmp/phpzoneinfo # fetch -o pecl-timezonedb.tgz http://pecl.php.net/get/timezonedb # tar -xzvf pecl-timezonedb.tgz # cd timezonedb-2014.10/
Компилируем исходный код и устанавливаем в систему новый timezonedb.
# phpize # ./configure # make install
Проверяем, был ли ранее установлен модуль timezonedb.
# php -m | grep timezonedb
timezonedb
В данном примере timezonedb был установлен ранее, поэтому действий больше не требуется, а если же вывод будет пустым, необходимо указать php при запуске подгружать новый модуль timezonedb.
# echo "extension=timezonedb.so" >> /usr/local/etc/php/extensions.ini
Удаляем временные файлы.
# rm -r /tmp/phpzoneinfo
Проверяем теперь соответствие между системным временем и временем интерпретатора php.
# php -r 'printf("PHP Time:"); date_default_timezone_set("Europe/Moscow"); echo "\n".date ( "d.m.Y H:i" ) ."\n" ;'
PHP Time: 19.11.2014 18:44
# echo "System Time: " ; date "+%d.%m.%Y %H:%M"
System Time: 19.11.2014 18:44
Время системное и время интерпретатора совпадает! Не забываем перезапустить службу, из-под которой запущен обработчик php (apache, php-fpm или др.).
# /usr/local/etc/rc.d/apache22 restart # /usr/local/etc/rc.d/php-fpm restart
Profit!