Обновление часовых поясов для php на сервере FreeBSD

#0. Резюме

Помимо основной базы системных часовых поясов на сервере, некоторые веб-службы, такие как 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 и т.п.).

#1. Обновление часовых поясов в php через pecl

Если на сервере присутствует утилита 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!

#2. Обновление часовых поясов в php ручной установкой модуля timezonedb

Если же на сервере отсутствует утилита 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!