2012-10-23 8 views
14

Quando utilizzo la funzione PHP date() su due server diversi, ottengo due risultati diversi, ma entrambi i server dovrebbero essere uguali.php.ini fuso orario predefinito vs. date.timezone

ho controllato il file php.ini sul server di # 1, dove il tempo è corretto, e appare come segue:

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 

ho controllato sul server di # 2 e sembra come segue:

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 

L'unica differenza che vedo è il valore "Fuso orario predefinito".

La data/ora per entrambi i server visualizzazione corrente come:

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

mi ha confermato che entrambi i server utilizzano il php.ini trova all'interno /etc e ho cercato anche entrambe le directory web per qualsiasi posto fuso orario potrebbe essere sovrascritto:

grep -r "date_default_timezone_set" * 

Ma a questo proposito, entrambi contengono gli stessi file con le stesse impostazioni.

"Timezone predefinito" qual è la causa della differenza di 5 ore? Se sì, come lo correggo?

UPDATE

file di configurazione di caricamento.

Server # 2 contiene due ulteriori file ini:

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

php risultati -i.

Server # 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 

Server # 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 

La cosa interessante da notare qui è che per qualche motivo il "fuso orario predefinito" non corrisponde sul server di # 2 quando visualizzandolo tramite php -i versus phpinfo() su una pagina web.

SOLUZIONE

Il problema era con il CMS e dei suoi plug-in. Mentre i server # 1 e # 2 avevano gli stessi file e tutto, sembra che i plugin non siano caricati nello stesso ordine su ciascun server, il che ha permesso l'ultimo plugin caricato per determinare il fuso orario del mio script.

Il motivo php -i e phpinfo è diverso perché dopo aver utilizzato date_default_timezone_set(), influisce su ciò che verrà stampato phpinfo().

La correzione era la garanzia di essere nel fuso orario in cui avevo bisogno di essere in via date_default_timezone_set().Il motivo per cui non ho funzionato prima di aver postato questa domanda era perché l'ho dichiarato prima di caricare alcuni file richiesti dal CMS, che probabilmente impostano di nuovo il fuso orario.

+0

L'ora di sistema su entrambi i server è uguale? –

+1

è davvero una buona idea configurare tutti i server per utilizzare UCT come data base. Rende tutto molto più prevedibile. – SDC

+0

@AlexLunix Sì, ho appena controllato e sono entrambi uguali: 'Tue Oct 23 10:03:57 CDT 2012' – NightHawk

risposta

11

date() si basa sull'impostazione date.timezone INI. Dal momento che uno è Chicago (CT) e l'altro è UTC, questa è la differenza di 5 ore.

credo dal PHP> 5,2 si dovrebbe ricevere:

PHP Warning: Unknown: Non è sicuro di fare affidamento sul fuso orario impostazioni del sistema. Sei richiesto per utilizzare l'impostazione date.timezone o la funzione date_default_timezone_set().

vi incoraggio a guardare la nuova DateTime oggetto o usare UTC, come consigliato dal DSC.

+0

'date.timezone' è impostato su php.ini. E sono entrambi impostati sullo stesso valore su entrambi i server. Non sono sicuro di dove sia impostato "Default timezone". – NightHawk

+0

+1 per raccomandare la classe DateTime. Non si comporta tanto male nei timezones rispetto alle vecchie funzioni di gestione delle date. Ed è anche molto più funzionale. La funzione 'date()' e i suoi amici dovrebbero essere gettati nella fossa e mai riportati indietro. – SDC

+0

Non è impostato da qualche parte, quindi il 'Default timezone UTC' sul Server # 2. –

5

Un paio di cose da controllare:

  1. Controllare il valore "Loaded Configuration File" nel tuo phpinfo uscita() per assicurarsi che si sta modificando il file php.ini corretto. (Questo mi ha morso più di una volta!)
  2. Se si guarda l'output di phpinfo(), controllare la riga "File .ini aggiuntivi analizzati" per vedere se sono stati analizzati altri file ini durante l'esecuzione tramite il server web.
  3. date.timezone può essere impostato tramite la funzione ini_set. Avete qualche codice che lo faccia? Assicurati di controllare qualsiasi codice che potrebbe essere in esecuzione a causa dell'impostazione auto_prepend ini.
+0

[1.] Appena ricontrollato, e sì, entrambi sono caricati da '/ etc/php.ini' [2.] Ho notato che sul server # 2 ci sono due file ini aggiuntivi:' snmp.ini' e 'apc.ini'. [3.] Cercherò qualcosa come 'init_set (date.timezone'? – NightHawk

+0

[2] Quei file ini non dovrebbero avere nulla per date.timezone, ma controllerei comunque. [3] Chiudi, cerca ini_set chiamate di funzione - http://php.net/ini_set – bradym

+0

[2.] Ho esaminato entrambi i file e non c'è nulla di tempo in loro. [3.] Ho eseguito una ricerca su entrambi i server e le sole funzioni 'ini_set' Ho visto sono relativi alla visualizzazione degli errori – NightHawk

2

Ecco il codice:

[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 

Basta cambiare date.timezone = ('America/New_York') per il fuso orario desiderato.

Source.

+0

Cosa fanno le parentesi, nella prima riga? I documenti non li hanno ... –

1

Utilizzando Ubuntu 14.0 LTS fuso orario default nel mio caso è stato fissato in:

/etc/php5/cli/php.ini

ho potuto quindi verificare con:

php -i | grep "timezone"

+0

Per l'interfaccia della riga di comando (cli) si. Ma le impostazioni di php web di apache sono in /etc/php5/apache2/php.ini –

1

Se si imposta il valore date.timezone in php.ini ma non funziona (ad esempio, il valore locale e il valore master sono diversi), potrebbe essere necessario aggiornare qualcosa di simile nel proprio file di configurazione Apache :

Al mod che ha eliminato la risposta precedente: ho cercato ore per trovare questa soluzione. Non eliminare una risposta solo perché pensi che sia una risposta duplicata.

Problemi correlati