Bug 24266

Summary: Fail to get timezone without tzdata
Product: Sisyphus Reporter: Nikolay A. Fetisov <naf>
Component: php-baseAssignee: Anton Farygin <rider>
Status: CLOSED NOTABUG QA Contact: qa-sisyphus
Severity: normal    
Priority: P3 CC: legion, naf, rider
Version: unstableKeywords: NMU, patch
Hardware: all   
OS: Linux   
Attachments:
Description Flags
Вариант решения: в отсутствии данных из tzdata считать timezone='UTC' none

Description Nikolay A. Fetisov 2010-10-11 07:39:16 MSD
Для 5.3.3.20100722-alt2.1 при попытке определения временной зоны не проверяется существование в системе каталога с описаниями зон.
Как следствие, в виртуальных серверах (где установка tzdata не обязательна и, в принципе, не нужна), php_get_timezone() выдаёт пустое значение, и далее php_rule вызывается с отсутствующим параметром:

# control apache2-mod_php5
find: `/usr/share/zoneinfo/': No such file or directory
find: `/usr/share/zoneinfo/': No such file or directory
apache2-mod_php5: Error: more arguments required: MODE DIRECTIVE VALUE [ INTRERNAL_VALUE ]
#
Comment 1 Nikolay A. Fetisov 2010-10-11 07:46:28 MSD
Created attachment 4602 [details]
Вариант решения: в отсутствии данных из tzdata считать timezone='UTC'

Простой, плохой, но быстрый вариант: в отсутствии файлов из tzdata не пытаться разбираться с /etc/localtime и принять timezone='UTC'. Ну и не искать в отсутствующих каталогах.
Comment 2 solo 2010-10-25 21:05:43 MSD
(В ответ на комментарий №1)
> Created an attachment (id=4602) [details]
> Вариант решения: в отсутствии данных из tzdata считать timezone='UTC'
> 
> Простой, плохой, но быстрый вариант: в отсутствии файлов из tzdata не пытаться
> разбираться с /etc/localtime и принять timezone='UTC'. Ну и не искать в
> отсутствующих каталогах.

  Похоже timezone='Etc/UTC' будет лучше.
Comment 3 solo 2010-10-25 21:09:01 MSD
  Перевешиваю на php-base, т. к. именно этому пакету принадлежит файл /etc/control.d/facilities/apache2-mod_php5 вызывающий данную ошибку.
Comment 4 solo 2010-10-25 21:16:21 MSD
(В ответ на комментарий №3)
>   Перевешиваю на php-base, т. к. именно этому пакету принадлежит файл
> /etc/control.d/facilities/apache2-mod_php5 вызывающий данную ошибку.
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  Выше, вру: имел в виду /etc/control.d/phpfunctions, т. к. функция php_get_timezone требующая непустого /usr/share/zoneinfo/ определена в нём.
Comment 5 solo 2010-10-25 22:02:30 MSD
  Предлагаю исправить так: http://git.altlinux.org/people/solo/packages/?p=php-base.git;a=commitdiff;h=aea60a7b5f532586524da0a839d0144710765aac

PS: Сейчас подготовлю NMU.
Comment 6 solo 2010-10-25 22:53:05 MSD
  Подготовленное NMU (php-base-2.6-alt1.1, см. http://git.altlinux.org/people/solo/packages/?p=php-base.git;a=commit;h=6d7e83135be5834ac3b9d4e233d6046aa214ef89) отправлено на сборку (task #31452). Прошу права на заливку (меня нет в ACL).
Comment 7 Alexey Gladkov 2010-10-25 23:20:43 MSD
Сейчас пакетом занимается kurakin@. Ему и решать.
Comment 8 Sergey Kurakin 2010-10-26 00:23:27 MSD
> Сейчас пакетом занимается kurakin@. Ему и решать.

Более того, я еще и автор той штуки, о которой сейчас идет речь.
Прошу прощения, но сию минуту принять решение не могу. Завтра посмотрю на свежую голову и почти наверняка сделаю approve.
Comment 9 solo 2010-10-26 11:26:03 MSD
  OK.

  Task собрался (http://git.altlinux.org/tasks/31452/task/log) и ожидаемым
образом работает у меня в виртуалке.

PS: Ещё один вариант исправления -- добавить "Requires: /usr/share/zoneinfo" но это приведёт к вытягиванию tzdata в виртуальные окружения.
Comment 10 Sergey Kurakin 2010-10-26 14:16:57 MSD
(In reply to comment #9)
>   Task собрался и ожидаемым образом работает у меня в виртуалке.

Нет, так всё-таки не надо. Получается, что при отсутствии zoneinfo установленное вручную значение timezone в php.ini будет заменено на Etc/UTC. И вся затея с автоматическим определением timezone превращается в медвежью услугу.

Сделаем так: 
http://git.altlinux.org/people/kurakin/packages/?p=php-base.git;a=commitdiff;h=1d032806c4ad9b40d8a2274e384e8d5f86fe080f

Проверка наличия zoneinfo, конечно, необходима. При отсутствии возвращаем пустую строку. А php_rule() при отсутствии параметра VALUE будет просто игнорировать правило. Таким образом, при невозможности определить timezone, этот параметр не будет учитываться и не будет обрабатываться.

Сейчас отправлю в Сизиф.

И спасибо за замечания и заинтересованность.
Comment 11 Repository Robot 2010-10-26 15:49:25 MSD
php-base-2.6-alt2 -> sisyphus:

* Tue Oct 26 2010 Sergey Kurakin <kurakin@altlinux> 2.6-alt2
- fixed issue with php_get_timezone feature and missing tzdata
  (closes: #24266)
- php-packaging.readme updated and moved here from php5 package
  as php-packaging.alt
Comment 12 solo 2010-10-27 13:02:44 MSD
(В ответ на комментарий №10)
> (In reply to comment #9)
> >   Task собрался и ожидаемым образом работает у меня в виртуалке.
> 
> Нет, так всё-таки не надо. Получается, что при отсутствии zoneinfo
> установленное вручную значение timezone в php.ini будет заменено на Etc/UTC. И
> вся затея с автоматическим определением timezone превращается в медвежью
> услугу.
> 
> Сделаем так: 
> http://git.altlinux.org/people/kurakin/packages/?p=php-base.git;a=commitdiff;h=1d032806c4ad9b40d8a2274e384e8d5f86fe080f
> 
> Проверка наличия zoneinfo, конечно, необходима. При отсутствии возвращаем
> пустую строку. А php_rule() при отсутствии параметра VALUE будет просто
> игнорировать правило. Таким образом, при невозможности определить timezone,
> этот параметр не будет учитываться и не будет обрабатываться.

  А можно сделать так, чтобы при отсутствии zoneinfo и установленного php.ini значение timezone правило всё таки отрабатывало, выставляя timezone в некое умолчальное состояние?

PS: Мне это для control`а для zabbix нужно: не работает зараза при отсутствующем/неопределённом в php.ini timezone.

PPS: Багу переоткрыл. Или лучше повесить новую?
Comment 13 Anton Farygin 2010-10-27 13:09:05 MSD
присоединяюсь к просьбе, и нужно всё-таки поставить зависимость на zoneinfo
Comment 14 Sergey Kurakin 2010-10-27 15:05:44 MSD
(In reply to comment #12)
>   А можно сделать так, чтобы при отсутствии zoneinfo и установленного php.ini
> значение timezone правило всё таки отрабатывало, выставляя timezone в некое
> умолчальное состояние?

Кстати да. Можно. Волшебное слово:

php_config |eval grep 'date.timezone'

Сейчас сделаю.

> PPS: Багу переоткрыл. Или лучше повесить новую?

Да пусть уж здесь.
Comment 15 Sergey Kurakin 2010-10-27 15:11:12 MSD
(In reply to comment #13)
> и нужно всё-таки поставить зависимость на zoneinfo

А оно нам надо лишние 4M в контейнере? Впрочем, я ovz сейчас не пользуюсь, так что решайте, кто пользуется. Права дам.
Comment 16 Anton Farygin 2010-10-27 15:14:08 MSD
а почему-бы и нет ? если оно реально нужно для работы...
Comment 17 solo 2010-10-27 15:27:49 MSD
  А нужно ли?

  Как именно работает параметр date.timezone?

1. Указывает timezone системных часов? Тогда при установки дистрибутивов по умолчанию у нас это у нас это UTC (если я правильно помню) и достаточно возвращать Etc/UTC в подавляющем большинстве случаев. Тем кто не использует UTC в качестве системной -- придётся указывать нужное в php.ini явно.

2. Указывает timezone в которую php пересчитывает время системных часов. Тогда да, требование zoneinfo обосновано: слишком велик разброс вариантов, для использования автоугодава...

  Какой у нас случай?
Comment 18 Anton Farygin 2010-10-27 15:49:05 MSD
о, а timezone у нас сейчас Internal - у PHP оторвана поддержка внешних таймзон.

Так что, можно делать всё что угодно, и установка timezone в систему не нужна.
Comment 19 Nikolay A. Fetisov 2010-10-27 16:08:42 MSD
Файлы из tzdata для работы PHP не нужны - описания зон он носит с собой своё. 
Кстати, согласно timezonedb.h (http://php.net/manual/en/timezones.php) он знает
569 зоны, что несколько меньше 1722 зон в tzdata. И он знает зону US/Pacific-New,
которой нет в tzdata.

По файлам tzdata - вообще-то, там не совсем 4 Mb, а примерно раза в два больше.
Там 1788 файлов и каталогов, и это приличная добавка к содержимому /usr/share.
Comment 20 Sergey Kurakin 2010-10-27 16:29:00 MSD
(In reply to comment #17)
>   Какой у нас случай?

Ни тот ни другой. data.timezone должен указывать на реальное местоположение сервера. Собственно часовой пояс php может получить и получает сам в формате MSD/4,0/DST. Но жалуется:

PHP Warning:  date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Moscow' for 'MSD/4,0/DST' instead

До 5.3 это было сообщение уровня E_STRICT, а начиная с 5.3.0 стало E_WARNING.

Так что часовой пояс php знает. Да еще и zoneinfo, как говорят, носит с собой. В сущности, процитированное предупреждение носит бюрократический характер, как отказ от ответственности: "Мы выбрали Москву из вашего часового пояса, но если вы в Петербурге, то мы ни за что не отвечаем."

Чтобы убрать эту бюрократию из логов, я и приделал автоугадав к php-control.
Comment 21 Sergey Kurakin 2010-10-27 17:31:35 MSD
(In reply to comment #14)
> (In reply to comment #12)
>>   А можно сделать так, чтобы при отсутствии zoneinfo и установленного php.ini
>> значение timezone правило всё таки отрабатывало, выставляя timezone в некое
>> умолчальное состояние?
> 
> Кстати да. Можно.
> Сейчас сделаю.

Прошу прощения, поторопился, не сделаю. Если так сделать, то в некоторых редких случаях (отсутствие zoneinfo && не определенная date.timezone && запуск control), мы получаем в php заведомо неправильную зону Etc/UTC со всеми вытекающими последствиями. При полной тишине в логах. 

Если необходимо обеспечить работу zabbix в контейнере из коробки без ручной установки date.timezone в php.ini, то затребуйте zoneinfo из zabbix'а.