Для 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 ] #
Created attachment 4602 [details] Вариант решения: в отсутствии данных из tzdata считать timezone='UTC' Простой, плохой, но быстрый вариант: в отсутствии файлов из tzdata не пытаться разбираться с /etc/localtime и принять timezone='UTC'. Ну и не искать в отсутствующих каталогах.
(В ответ на комментарий №1) > Created an attachment (id=4602) [details] > Вариант решения: в отсутствии данных из tzdata считать timezone='UTC' > > Простой, плохой, но быстрый вариант: в отсутствии файлов из tzdata не пытаться > разбираться с /etc/localtime и принять timezone='UTC'. Ну и не искать в > отсутствующих каталогах. Похоже timezone='Etc/UTC' будет лучше.
Перевешиваю на php-base, т. к. именно этому пакету принадлежит файл /etc/control.d/facilities/apache2-mod_php5 вызывающий данную ошибку.
(В ответ на комментарий №3) > Перевешиваю на php-base, т. к. именно этому пакету принадлежит файл > /etc/control.d/facilities/apache2-mod_php5 вызывающий данную ошибку. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Выше, вру: имел в виду /etc/control.d/phpfunctions, т. к. функция php_get_timezone требующая непустого /usr/share/zoneinfo/ определена в нём.
Предлагаю исправить так: http://git.altlinux.org/people/solo/packages/?p=php-base.git;a=commitdiff;h=aea60a7b5f532586524da0a839d0144710765aac PS: Сейчас подготовлю NMU.
Подготовленное 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).
Сейчас пакетом занимается kurakin@. Ему и решать.
> Сейчас пакетом занимается kurakin@. Ему и решать. Более того, я еще и автор той штуки, о которой сейчас идет речь. Прошу прощения, но сию минуту принять решение не могу. Завтра посмотрю на свежую голову и почти наверняка сделаю approve.
OK. Task собрался (http://git.altlinux.org/tasks/31452/task/log) и ожидаемым образом работает у меня в виртуалке. PS: Ещё один вариант исправления -- добавить "Requires: /usr/share/zoneinfo" но это приведёт к вытягиванию tzdata в виртуальные окружения.
(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, этот параметр не будет учитываться и не будет обрабатываться. Сейчас отправлю в Сизиф. И спасибо за замечания и заинтересованность.
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
(В ответ на комментарий №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: Багу переоткрыл. Или лучше повесить новую?
присоединяюсь к просьбе, и нужно всё-таки поставить зависимость на zoneinfo
(In reply to comment #12) > А можно сделать так, чтобы при отсутствии zoneinfo и установленного php.ini > значение timezone правило всё таки отрабатывало, выставляя timezone в некое > умолчальное состояние? Кстати да. Можно. Волшебное слово: php_config |eval grep 'date.timezone' Сейчас сделаю. > PPS: Багу переоткрыл. Или лучше повесить новую? Да пусть уж здесь.
(In reply to comment #13) > и нужно всё-таки поставить зависимость на zoneinfo А оно нам надо лишние 4M в контейнере? Впрочем, я ovz сейчас не пользуюсь, так что решайте, кто пользуется. Права дам.
а почему-бы и нет ? если оно реально нужно для работы...
А нужно ли? Как именно работает параметр date.timezone? 1. Указывает timezone системных часов? Тогда при установки дистрибутивов по умолчанию у нас это у нас это UTC (если я правильно помню) и достаточно возвращать Etc/UTC в подавляющем большинстве случаев. Тем кто не использует UTC в качестве системной -- придётся указывать нужное в php.ini явно. 2. Указывает timezone в которую php пересчитывает время системных часов. Тогда да, требование zoneinfo обосновано: слишком велик разброс вариантов, для использования автоугодава... Какой у нас случай?
о, а timezone у нас сейчас Internal - у PHP оторвана поддержка внешних таймзон. Так что, можно делать всё что угодно, и установка timezone в систему не нужна.
Файлы из tzdata для работы PHP не нужны - описания зон он носит с собой своё. Кстати, согласно timezonedb.h (http://php.net/manual/en/timezones.php) он знает 569 зоны, что несколько меньше 1722 зон в tzdata. И он знает зону US/Pacific-New, которой нет в tzdata. По файлам tzdata - вообще-то, там не совсем 4 Mb, а примерно раза в два больше. Там 1788 файлов и каталогов, и это приличная добавка к содержимому /usr/share.
(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.
(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'а.