2014-04-01 15 views
14

Jestem trochę zirytowany utrzymywaniem strefy czasowej w PHP. Uwielbiam to, że wszystko inne w moim systemie wierzy, że utrzymuję prawidłową strefę czasową systemu. Może mogą być przypadki użycia, w których może być korzystne skonfigurowanie PHP inaczej, ale dlaczego PHP ostrzega mnie o poleganiu na mojej strefie czasowej nie jest bezpieczne?Dlaczego PHP uważa, że ​​złym pomysłem jest poleganie na strefie czasowej systemu?

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

+0

@ NicolòMonili wciąż wierzą w magię? Myślałem, że zniosły to w pewnym momencie (a raczej później) w średniowieczu. Nauka to magia * de jour *! –

+0

To pytanie wydaje się być nie na temat, ponieważ można je znaleźć za pomocą prostego [search] (https://www.google.com.sg/search?q=date.timezone+E_WARNING+--+Really+ necessessary) –

+0

StasM odpowiedział na to dobrze tutaj: http://stackoverflow.com/a/11749041/1952201 – huwiler

Odpowiedz

8

Oto co deweloperów PHP powiedzieć o nim (w related discussion):

Nie - ty, jako administratora są wymagane do podjęcia świadomej decyzji o co chcesz stref czasowych być. Było zbyt wiele zgłoszeń o błędach , gdzie ludzie nie mieli pojęcia, więc teraz rzucamy ostrzeżenie.

Derick Rethans jest autorem this commit że zwrócił date_warning z E_STRICT (w PHP 5.2-) do E_WARNING (PHP 5.3+).

Taka sama dyskusja ma dość dźwięk (jeszcze) oczywiście niewygodne rozwiązanie to stosowane przez MediaWiki:

Faktycznie, rozsądny domyślnym jest co guess_timezone() robi już wyjątkiem bez ostrzeżenia. Możesz uzyskać takie zachowanie dzięki np.

date_default_timezone_set(@date_default_timezone_get()); 

u góry programu. To właśnie robi MediaWiki (z wyjątkiem tego, że przez modyfikowanie error_reporting zamiast korzystania z @). Ukradliśmy pomysł z innej aplikacji internetowej pod numerem . Jest to wygodniejsze niż powielenie funkcji z aplikacji guess_timezone().

To przywilej Derick do drażnić wszystkich użytkowników pół do śmierci z ostrzeżeń, jak jego sposób wskazujący jego niechęć do stanu OS obsługą zapytań od strefy czasowej systemu. To jest nagroda, którą dajemy mu za napisanie partii kodu daty/czasu.

Kluczową częścią tego obejścia jest funkcja date_default_timezone_get, która w kolejności zwraca domyślną strefę czasową według ...

  • czytania zestawu strefy czasowej przy użyciu funkcji date_default_timezone_set() (jeśli występują)
  • czytanie zmiennej środowiskowej TZ (jeśli nie puste) (przed PHP 5.3.0)
  • czyta wartość opcji ini date.timezone (jeśli ustawione)
  • odpytywanie system bazowy (jeżeli są możliwe i dozwolone przez OS)
-2

PHP jest często używany przez ludzi, którzy NIE prawidłowo utrzymać swoje systemy, lub uruchomić na systemach innych ludzi (dzielonego hostingu). Jeśli prawidłowo konserwujesz system, konfigurowanie domyślnej strefy czasowej PHP jest proste.

+0

Twoje zdanie "często używane przez osoby, które nie obsługują prawidłowo" jest oparte na czym? Ponadto nadal nie rozumiem, dlaczego warto było ostrzec, że jest ** niebezpieczny **. –

+1

Przez miliony serwerów hostingowych PHP obsługujących dziesiątki milionów stron opartych na PHP w porównaniu z liczbą firm, które mogą sobie pozwolić na korzystanie z dedykowanych zasobów. –

+1

Moje oświadczenie jest oparte na ponad dekadzie doświadczenia jako profesjonalnego programisty PHP, pracującego zarówno w dużych organizacjach (jak ja teraz), jak i jako niezależny wykonawca (posiadałem własną firmę programistyczną). Widziałem prawie każdego rodzaju ludzi, którzy potrzebują "programistów PHP" lub "tworzenia stron internetowych". Pełne 80% stron PHP, które widziałem, nie ma właściwego administratora serwera. – dotancohen

8

Ponieważ Derick tak mówi. Dlatego. To internals mailing list thread powie ci wszystko o "logice" kryjącej się za tą decyzją. Ostrzeżenie date.timezone jest stałą uciążliwością dla każdego, kto używa PHP jako języka programowania, a nie zastępuje wiedzy o pisaniu kodu.

Dokładniej, to zachowanie powoduje przyciąganie mi. Normalnie nie nadużywałbym SO Q & System wentylacji, ale to ostrzeżenie napędza mnie bananami. Poza tym jest 1 kwietnia, więc czemu nie?

+0

Czy naprawdę trudno jest ustawić 'date.timezone' w pliku' php.ini'? [Najwyraźniej ...] (http://stackoverflow.com/questions/22760173/setting-timezone-not-applying) –

+0

@NiettheDarkAbsol Tak, to jest!Utrzymywanie systemowej strefy czasowej nie ma sensu, po prostu obserwując zegar systemu, wcześniej skonfigurowana strefa czasowa PHP będzie łatwo nadzorowana podczas zmiany strefy czasowej. OK, to rzadki przypadek użycia, ale wkrótce przenoszę laptopa do czwartej strefy czasowej. –

+0

@NiettheDarkAbsol To nie jest kwestia trudności. Chodzi o wymuszenie na użytkownikach znanego wzorca antypoślizgowego (to jest anty-wzorcem rejestru za pośrednictwem plików .ini). Mam dokładnie * zero * użycie pliku php.ini podczas programowania, ponieważ jest niepotrzebnym globalnym wprowadzeniem do moich programów. Nie powinienem być zmuszany do używania pliku php.ini do uruchamiania bez niepotrzebnych wiadomości 'E_WARNING'. – rdlowrey

0

1) korzystanie z systemu Strefa czasowa to major performance overhead.

2) implementacje bazy TZ przez różnych producentów mają historicaly miał wiele problemów funkcjonalnych

3) istnieją problemy wokół intellectual property danych. Jest to zagrożenie roszczeniami i kosztami ich obrony, co podważa takie projekty - a nie ważność roszczenia. Sprawa z 2011 r. Została rozstrzygnięta poza sądem, co oznacza, że ​​sprawa została rozstrzygnięta tylko w przypadku powoda, a nie w przypadku przyszłych wyzwań.

4) Konsekwencją (3) jest to, że nawet jeśli administrator systemu jest DILLIGENT aktualizacje mogą być problemy upstream uniemożliwiające rozpowszechnianie zmienionych danych

+0

1) odnosi się do poprawionego PHP Ubuntu. Nie pokazuje ogólnie, dlaczego używanie systemu TZ powinno być problemem z wydajnością. –

Powiązane problemy