Ошибка PHP getdate() при переходе с PHP 5.2 на 5.3

Я столкнулся с той же проблемой, описанной здесь, ошибка с часовым поясом:

Конфигурация PHP : небезопасно полагаться на системные настройки часового пояса

Я хочу провести конструктивный разговор с моей службой хостинга. Так что сначала я немного покопался сам. Это сервер Apache, я не уверен, на какой ОС он работает.

Мой phpinfo() утверждает следующее:

Loaded Configuration File   /usr/local/php53/lib/php.ini

и это для часового пояса:

date/time support   enabled
"Olson" Timezone Database Version   2013.3
Timezone Database   internal
Default timezone    America/Chicago

Итак, на первый взгляд кажется, что часовой пояс установлен правильно. Тем не менее, я все еще получаю сообщение об ошибке:

getdate() [function.getdate]: 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 'America/Chicago' for
'CST/-6.0/no DST' instead

Я ожидаю, что мой хост скажет мне: «Извините, настройка правильная — обновите приложение, чтобы устранить эту ошибку».

Должен ли я позволить им уйти с этим ответом или я должен заставить их проверить настройки в другом месте, которое заканчивается на /cli/php.ini?

Думаю, я не понимаю, где этот файл будет в моем случае или почему на него вообще будет ссылка, если phpinfo() говорит, что единственный загружаемый ini-файл находится в /usr/local/php53/lib/php.ini.

Любая помощь в понимании этого будет очень признательна. Я ненавижу разговаривать с моими принимающими людьми, не имея полного понимания проблемы.


person Chris    schedule 16.11.2015    source источник
comment
Вы упомянули CLI. Это где ошибка проявляется? Часто CLI и веб-сервер имеют разные php.ini файлы.   -  person ceejayoz    schedule 16.11.2015
comment
Тут моих знаний не хватает. Я упомянул CLI только потому, что другой поток, на который я ссылался (в моем вопросе), говорил об этом. Я не понимаю, что это такое и что оно делает, и должен ли я вообще спрашивать об этом у службы хостинга.   -  person Chris    schedule 16.11.2015


Ответы (2)


Это происходит потому, что в выпуске 5.3 разработчики PHP приняли решение потребовать, чтобы часовой пояс был явно установлен в файле PHP.ini (или в .htaccess, или с использованием date_default_timezone_set()). Причина, по которой это было сделано, заключалась в предполагаемой проблеме с более ранними версиями PHP, где часовой пояс не был установлен, и люди полагались на значение по умолчанию, которое часто было неправильным (например, потому что они использовали размещенный сервер в другом часовом поясе). Было большое количество серьезных проблем, вызванных этим, и требование явной установки было попыткой решить эти проблемы.

Решение состоит в том, чтобы убедиться, что ваш файл PHP.ini содержит настройку часового пояса. Если вы находитесь на общем хосте и не можете обновить PHP.ini, вы можете установить его в локальном файле .htaccess (при условии, что вы находитесь на сервере Apache; другое серверное программное обеспечение может отличаться). И если вы не можете установить его там, то вы должны установить его в коде.

У вашего хоста явно не установлен часовой пояс в PHP.ini. Учитывая, что сервер только обновляется с PHP 5.2, это неудивительно; 5.2 не требует его установки (по умолчанию он соответствует системному часовому поясу), поэтому его легко пропустить при обновлении.

С вашей точки зрения, вы можете полностью избежать разговора с хостом, установив часовой пояс в .htaccess. Просто создайте файл .htaccess (или отредактируйте существующий) со следующей строкой:

php_value date.timezone "America/Chicago"

Тем не менее, в идеале он действительно должен быть установлен в файле PHP.ini, и если он находится под контролем ваших хостов, то было бы хорошо, если бы вы подняли его вместе с ними — не устанавливать это очень ясно. знак того, что они на самом деле ничего не знают о PHP, и они, конечно же, не проверяли свою конфигурацию после обновления. Это должно вас беспокоить, так как из-за этого могут возникнуть другие проблемы; в PHP между версиями 5.2 и 5.3 произошли некоторые существенные изменения, ряд функций устарел, а значения конфигурации по умолчанию изменены, о чем вам и вашему хосту действительно нужно знать при выполнении этого обновления.

Интересно, что решение об этом предупреждении о часовом поясе на самом деле сейчас находится в процессе отмены: с предстоящим выпуском PHP 7.0 вам больше не нужно будет явно указывать часовой пояс в PHP.ini. Подробнее об этом изменении можно прочитать здесь: https://wiki.php.net/rfc/date.timezone_warning_removal. Это, очевидно, не повлияет на вас сейчас, но, тем не менее, это интересно.

Пока я отвечаю, я хотел бы повторить абзац выше — т. е. выпуск PHP7 в следующем месяце — и отметить, что вы обновляете версию PHP, которая уже давно устарела.

PHP 5.3 был объявлен End Of Life более года назад (август 2014 г.), и с тех пор не было никаких обновлений. Даже PHP 5.4 теперь устарел (хотя это произошло только что). Я очень рад слышать, что вы отказываетесь от версии 5.2, но вам не следует соглашаться на версию 5.3: я настоятельно рекомендую вам обновиться сейчас, пока вы все равно выполняете работу по обновлению, потому что в противном случае это будет стоить вам больше времени в будущем.

Я не предлагаю полностью перейти на PHP7, но вы должны рассматривать 5.4 как абсолютный минимум, а 5.5 или 5.6 как предпочтительные версии сегодня. Безусловно, самая большая проблема при обновлении с 5.2 до 5.3, так что вы уже проделали тяжелую работу; переместить еще одну или две версии сейчас вряд ли будет дополнительной работой, пока вы все равно это делаете.

person Simba    schedule 16.11.2015
comment
Спасибо... Я возможно смогу перейти на 5.4, но система корзины покупок, на которой я работаю, по какой-то причине не работает с 5.5. Если я не смогу самостоятельно исправить PHP-код корзины для перехода с 5.4 на 5.5, я очень долго застряну на 5.4. - person Chris; 16.11.2015
comment
Кроме того, мой phpinfo(), кажется, показывает, что по умолчанию установлено значение is... поэтому я до сих пор не понимаю, почему я даже получаю эту ошибку (см. мой исходный пост/вопрос выше... ) - person Chris; 16.11.2015
comment
Относительно сбоя кода на 5.5... это не должно иметь большого значения; разрывы совместимости между 5.4 и 5.5 были действительно незначительными (см. php.net/migration55), поэтому легко найти проблему. (Вы не хотите навсегда застрять на фиксированной версии PHP, независимо от того, какая это версия... и чем дольше вы ее оставляете, тем сложнее впоследствии обновиться - как вы сейчас обнаружите) - person Simba; 17.11.2015
comment
Что касается значения по умолчанию: Ну, PHP 5.3 по-прежнему будет использовать значение по умолчанию из ОС, даже если оно не установлено в php.ini, как это было раньше в PHP 5.2, так что с этой точки зрения ничего не изменилось. Разница в том, что 5.3 теперь выдает предупреждающее сообщение. Помимо сообщения, функциональность идентична, поэтому вы все равно увидите, что установлено значение по умолчанию, потому что оно установлено. - person Simba; 17.11.2015
comment
Спасибо за отличный анализ/совет, Симба. Сейчас у меня 5.3, и да, я сосредоточусь на том, чтобы как можно скорее добраться до 5.5. - person Chris; 18.11.2015

вам нужно установить свой часовой пояс

date_default_timezone_set('Europe/London');

http://php.net/manual/en/function.date-default-timezone-set.php

person Roma Rush    schedule 16.11.2015
comment
Это действительно решает проблему, но я бы определенно установил веб-хост по умолчанию в php.ini, а не в каждом PHP-скрипте. - person ceejayoz; 16.11.2015
comment
Правильно. Я добавил вызов функции в config.php приложения, что эффективно решит проблему, но я хочу понять, почему проблема возникает в первую очередь. - person Chris; 16.11.2015