Ошибка 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

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

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, так что вы уже проделали тяжелую работу; продвижение версии или еще двух вряд ли будет сейчас дополнительной работой, в то время как вы все равно это делаете.

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

date_default_timezone_set('Europe/London');

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

Другие вопросы по тегам