В ответ на объявление о том, что WordPress 3.2 (выйдет позднее в этом месяце) потребует PHP 5.2.4 + , я сегодня обновил свой тестовый компьютер Windows с XAMPP 1.5.5 до 1.7.4, что вturn поднял меня с PHP 5.2.0 на 5.3.5.
У меня почти все снова работает, но одна тестовая страница ведет себя странно.У меня есть таблица MySQL с идентификаторами tz по коду страны, и следующий скрипт определяет и отображает текущее время в каждом часовом поясе:
<?php
echo "<table>";
$result = mysql_query("SELECT * FROM zone_data ORDER BY `id` ASC;");
while ($row = mysql_fetch_assoc($result)) {
putenv("TZ=".$row['zone_name']);
echo "<tr>";
echo "<th>".$row['zone_code']."</th>";
echo "<td>".$row['zone_name']."</td>";
echo "<td>".date("D j M Y / H:i T",$_GET['t']);
if (date("I") == 1) { echo "*"; } // asterisk if in DST
echo " (".date("P",$_GET['t']).")</td>";
echo "</tr>";
}
echo "</table>";
?>
Ожидаемый вывод, который прекрасно работает на производственном сервере в PHP5.2.17, должно быть примерно так:
Z Etc/UTC Fri 3 Jun 2011 / 03:22 UTC (+00:00)
AD Europe/Andorra Fri 3 Jun 2011 / 05:22 CEST* (+02:00)
AE Asia/Dubai Fri 3 Jun 2011 / 07:22 GST (+04:00)
AF Asia/Kabul Fri 3 Jun 2011 / 07:52 AFT (+04:30)
AG America/Antigua Thu 2 Jun 2011 / 23:22 AST (-04:00)
...
... но вместо этого мне говорят, что время совпадает с моим системным временем, America/New_York
(в настоящее время UTC-4) в каждая зона:
Z Etc/UTC Thu 2 Jun 2011 / 23:22 EDT* (-04:00)
AD Europe/Andorra Thu 2 Jun 2011 / 23:22 EDT* (-04:00)
AE Asia/Dubai Thu 2 Jun 2011 / 23:22 EDT* (-04:00)
...
Теперь я заметил, что строка 1001 нового php.ini
, установленного с XAMPP 1.7.4, изначально содержала date.timezone = Europe/Berlin
поэтому я заменил его на date.timezone = America/New_York
.Но в обоих случаях каждый экземпляр функции date()
определяется этим параметром независимо от того, что я сказал иначе с putenv()
.То же самое верно и для всех других страниц, использующих date()
(хотя gmdate()
, очевидно, возвращает GMT, как и ожидалось).
Я пытался закомментировать эту строку, но PHP 5.3.5 выдал lovely ошибки, говорящие о том, что «полагаться на настройки часового пояса системы небезопасно» и что мне требуется для использования директивы date.timezone
в php.ini
, хотя я всегда использую putenv()
, когдаЯ использую date()
или аналогичные функции.
Немного расстраивает необходимость установки «суперглобальной» настройки, особенно для случая, подобного этому, когда целое значение временно войдите в новую среду TZ и почерпните из нее некоторую полезную информацию.
Итак ... Есть ли способ заставить директиву date.timezone
работать по умолчанию, которую можно переопределитьputenv()
так, что последнее не полностью игнорируется?Есть ли еще что-то, о чем вы можете подумать, что может вызвать неожиданное / причудливое поведение, описанное выше?
Я склонен полагать, что это всего лишь некоторые настройки сервера, которые необходимо изменить, чтобы разрешить putenv()
продолжить работу в PHP 5.3.5, как это было в 5.2.0 (и в 5.2.17).Конечно, если и есть «лучший путь», я не против услышать об этом (мне всегда нравится узнавать что-то новое!).Но в основном я хочу, чтобы мой старый код работал при моей новой установке.
Дайте мне знать, если вам нужна дополнительная информация о моей установке.