2012-10-23 17 views
14

Kiedy używam funkcji PHP date() na dwóch różnych serwerach, otrzymuję dwa różne wyniki, ale oba serwery powinny być takie same.php.ini domyślna strefa czasowa vs. data.timezone

Sprawdziłem plik php.ini na serwerze # 1, gdzie czas jest poprawny, i wygląda następująco:

date/time support     enabled 
"Olson" Timezone Database Version 0.system 
Timezone Database     internal 
Default timezone     America/Chicago 

Directive  Local Value  Master Value 
--------------------------------------------------- 
date.timezone America/Chicago America/Chicago 

Sprawdziłem na serwerze # 2 i wygląda następująco:

date/time support     enabled 
"Olson" Timezone Database Version 0.system 
Timezone Database     internal 
Default timezone     UTC 

Directive  Local Value  Master Value 
--------------------------------------------------- 
date.timezone America/Chicago America/Chicago 

Jedyna różnica jaką widzę to "Domyślna strefa czasowa".

data/czas na obu serwerach prądu wyświetlacz jak:

Server #1: 10/23/2012 09:40:39 
Server #2: 10/23/2012 14:40:39 

I potwierdził, że oba serwery użyć php.ini położony w /etc i ja również wyszukiwane obu katalogach internetowych dla każdego miejsca strefa czasowa może zostać nadpisane:

grep -r "date_default_timezone_set" * 

Pod tym względem oba zawierają te same pliki z tymi samymi ustawieniami.

Czy "Domyślna strefa czasowa" jest przyczyną różnicy 5 godzin? Jeśli tak, jak mogę to poprawić?

UPDATE

Załadowane pliki konfiguracyjne.

Serwer # 2 zawiera dwa dodatkowe pliki ini:

/etc/php.d/snmp.ini 
/etc/php.d/apc.ini 

php opcje -i wyników.

Serwer # 1:

date/time support => enabled 
"Olson" Timezone Database Version => 0.system 
Timezone Database => internal 
Default timezone => America/Chicago 

Directive => Local Value => Master Value 
date.timezone => America/Chicago => America/Chicago 

Serwer # 2:

date/time support => enabled 
"Olson" Timezone Database Version => 0.system 
Timezone Database => internal 
Default timezone => America/Chicago 

Directive => Local Value => Master Value 
date.timezone => America/Chicago => America/Chicago 

Co ciekawe, jest to, że z jakiegoś powodu "Domyślna strefa czasowa" nie zgadza się na serwerze # 2, gdy oglądanie go przez php -i na stronie internetowej: phpinfo().

ROZWIĄZANIE

Problem był z CMS i jego wtyczek. Chociaż serwer nr 1 i nr 2 miał te same pliki i wszystko, wygląda na to, że wtyczki nie są ładowane w tej samej kolejności na każdym serwerze, co umożliwiło załadowanie ostatniej wtyczki w celu określenia strefy czasowej mojego skryptu.

Przyczyną różnic php -i i phpinfo jest to, że po użyciu date_default_timezone_set() ma to wpływ na to, co zostanie wydrukowane przez phpinfo().

Poprawka polegała na upewnieniu się, że jestem w strefie czasowej, w której musiałem być zalogowany przez date_default_timezone_set().Przyczyną, która nie zadziałała dla mnie, zanim opublikowałem to pytanie, było to, że zadeklarowałem to przed załadowaniem kilku wymaganych plików z CMS, które prawdopodobnie ustawiły tam strefę czasową.

+0

Czy czas systemowy na obu serwerach jest taki sam? –

+1

To naprawdę dobry pomysł, aby skonfigurować wszystkie serwery, aby używać UCT jako daty bazowej. Dzięki temu wszystko staje się o wiele bardziej przewidywalne. – SDC

+0

@AlexLunix Tak, właśnie sprawdziłem i oba są takie same: 'Tue 23 października 10:03:57 CDT 2012' – NightHawk

Odpowiedz

11

date() polega na ustawieniu INI date.timezone. Ponieważ jeden to Chicago (CT), a drugi to UTC, to jest twoja 5-godzinna różnica.

wierzę od PHP> 5.2 powinny pojawić:

PHP Warning: Unknown: To nie jest bezpieczne polegać na strefę czasową ustawień systemu. Jesteś wymagany, aby użyć ustawienia date.timezone lub date_default_timezone_set().

chciałbym zachęcić do obejrzenia nowego DateTime obiektu lub użyj UTC, zgodnie z zaleceniem SDC.

+0

'date.timezone' jest ustawione wewnątrz php.ini. Oba mają taką samą wartość na obu serwerach. Nie wiem, gdzie jest ustawiona "Domyślna strefa czasowa". – NightHawk

+0

+1 za polecanie klasy DateTime. Nie ma tak dużego problemu ze strefami czasowymi niż stare funkcje obsługi daty. I jest znacznie bardziej funkcjonalny. Funkcja 'date()' i jej przyjaciele powinni zostać wrzuceni do dołu i nigdy nie wracać. – SDC

+0

To nie jest gdzieś ustawione, stąd "Domyślna strefa czasowa UTC" na serwerze nr 2. –

5

Kilka rzeczy do sprawdzenia:

  1. sprawdzić wartość "Loaded Configuration File" w phpinfo() wyjście do upewnij się, że zmieniając poprawny plik php.ini. (To mnie ugryzło więcej niż jeden raz!)
  2. Podczas przeglądania danych wyjściowych phpinfo() zaznacz opcję "Dodatkowe sparsowane pliki .ini", aby sprawdzić, czy podczas pracy z serwerem są analizowane dodatkowe pliki ini.
  3. date.timezone można ustawić za pomocą funkcji ini_set. Czy masz jakiś kod, który to robi? Pamiętaj, aby sprawdzić również kod, który może być uruchomiony z powodu ustawienia automatycznego inn-run-ini.
+0

[1.] Wystarczy dwukrotnie ponownie sprawdzić, i tak, oba są ładowane z '/ etc/php.ini' [2.] Zauważyłem, że na serwerze # 2 są dwa dodatkowe pliki ini:' snmp.ini' i 'apc.ini'. [3.] Czy szukałem czegoś takiego jak 'init_set (date.timezone'? – NightHawk

+0

[2] Te pliki ini nie powinny mieć nic na date.timezone, ale mimo to sprawdziłbym. [3] Zamknij, poszukaj ini_set wywołania funkcji - http://php.net/ini_set – bradym

+0

[2.] Zajrzałem do obu plików i nie ma w nich nic o czasie. [3.] Przeprowadziłem wyszukiwanie na obu serwerach i tylko funkcje 'ini_set' Widziałem związane z wyświetlaniem błędu – NightHawk

2

Oto kod:

[Date] 
date.timezone = ('America/New_York') 

date.default_latitude = 31.7667 

date.default_longitude = 35.2333 

date.sunrise_zenith = 90.583333 

date.sunset_zenith = 90.583333 

Wystarczy zmienić date.timezone = ('America/New_York') do wybranej strefy czasowej.

Source.

+0

Co robią nawiasy, w pierwszym wierszu? Dokumenty nie mają ich ... –

1

Ubuntu 14.0 LTS Korzystanie domyślnej strefy czasowej w moim przypadku został ustawiony w:

/etc/php5/cli/php.ini

mogłem wtedy zweryfikować z:

php -i | grep "timezone"

+0

Dla interfejsu wiersza poleceń (cli) Tak, ale ustawienia Apache web php znajdują się w /etc/php5/apache2/php.ini –

1

Jeśli ustawisz wartość date.timezone w php.ini, ale to nie zadziała (np. wartość lokalna i główna wartość są różne), możesz potrzebować zaktualizować coś takiego w pliku konfiguracyjnym Apache :

<IfModule mod_php5.c> 
    php_value date.timezone "Europe/Paris" 
</IfModule> 

aby mod, który został usunięty przed powyższą odpowiedź: Przeszukałem godzin, aby znaleźć to rozwiązanie. Nie usuwaj odpowiedzi tylko dlatego, że uważasz, że jest to duplikat odpowiedzi.

Powiązane problemy