웹마스터 팁
timezone (타임존) 관련한 문제 (SERVER, DBMS, PHP, XE)
2015.01.07 21:22
타임존 관련하여 약간의 삽질을 겪고 나서 팁을 올립니다.
대부분의 중요 기능에서는 시간관련하여 문제가 없었지만,
일부 위젯 및 레이아웃의 일부 기능에서 시간 관련 오작동이 일어났습니다.
(다른 기능은 다 잘 되는데 카운터만 12시 땡 쳤는데 리셋이 안된다거나,
회원 가입일이 약간 안맞는 느낌이 든다거나... 그런 경우입니다)
XE 내부에서 무슨 일이 일어나는지 잘 모르다보니,
그냥 하나씩 때려잡아서 잡히면 넘어가는 식으로 해결을 보았지만,
좀 지저분하게 끝난 것 같아서 찜찜하네요.
보다 깔끔하게 정리하는 방법이 있을 것도 같습니다.
본론으로 들어가서
0. 타임존 관련하여 살펴보아야 할 것은 총 4가지 입니다.
ⓐ Server ⓑ MySQL ⓒ PHP ⓓ XE
1. 본인이 서버를 운영하지 않는 경우라면
ⓐ~ⓒ 는 바꿀 수가 없습니다(99.99%).
ⓓ 의 관리자 페이지에서 타임존 설정하여 문제를 해결하거나,
코드를 일일이 수정하여 사용하는 방법 뿐입니다.
가급적 그냥 넘어가는 편이 좋습니다.
2. 본인이 서버를 운영하는 경우라면
ⓐ~ⓒ 를 바꾸어 문제를 해결할 수도 있습니다.
2-1. 우선 각각 어떤 시간설정이 되어 있는지 확인을 하세요.
2-1-1 서버 :
prompt > date
2-1-2 MySQL :
MariaDB [mysql]> show variables like "%time_zone"; 혹은 select now();
2-1-3 PHP
phpinfo(); 에서 date.timezone 확인 혹은 php.ini 파일에서 date.timezone 확인
2-1-4 XE
관리자 페이지 - 설정 - 일반 - 현재 표준시 확인
문제가 발생하고 있다면 이것들의 설정이 서로 다르기 때문입니다.
물론... 원래는 설정이 다르다고 해서 엔드유저에게 이것 때문에 문제가 생겨서는 안됩니다.만...
실제로는 그런 일이 일어나네요. ㅎㅎ
2-2. 해결 방향의 모색
여기가 문제인데...
어떤것을 기준으로 해서 문제를 해결하는게 맞는건지 저도 잘 모르겠습니다.
최선은
ⓐ~ⓒ 모두 UTC를 표준으로 동일하게 세팅하고, ⓓ 부분만 KST로 변경하여
서버 관리자는 UTC를 사용하고
웹 사용자는 KST(한국시간)을 적용받는 방식인것 같습니다.
차선은
ⓐ~ⓓ 모두다 KST를 적용하여 세팅하는 것입니다.
(데이터가 주로 국내에서만 돌고도는 경우라면 이것도 나쁘지 않을 듯)
최선이든 차선이든 ⓐ~ⓒ가 통일되면,
기본적인 문제해결은 끝이 난 것이라고 봐야되고,
db 날자를 일괄 수정하거나 하는 작업은 추가로 필요할 수도 있고,
필요 없을 수도 있습니다. (이게 더 중요한 문제일지도... -_-;)
3. TIP
이런 문제가 발생하지 않는 가장 좋은 방법은
서버 세팅 초반 ⓑ~ⓒ PHP, DBMS 등 설치 전에
ⓐ 시스템 타임존을 UTC나 KST로 바꾸는 것입니다.
(EST 같은걸로 되어 있으면 문제가 발생할 소지가 있습니다)
댓글 2
-
Hello_XE
2015.01.07 22:05
-
세상의모든계산기
2015.01.08 00:30
그렇다면
문제가 됐던 위젯 등을 만드신 분이 시간 관련한 함수를 처리함에 있어서
프로그램 < -- > XE <--> DB(SERVER)
이렇게 처리되도록 하지 않고,
프로그램 <--> DB(SERVER)
이렇게 코딩을 하기 때문에
발생하였던 문제라고 볼 수가 있겠군요.
* 코딩하던 환경(개발자 서버)은 KST 적용되는 상황이니 문제가 드러나지 않지만,
유저 환경(사용자 서버)은 KST가 아니다보니 문제가 드러나게 되는 거구요.
대충 이해가 가네요.
저도 이전에 같은 문제고 고민을 많이 했습니다만....
함수중에 date함수를 쓰는것보다 xe자체내장함수인 zdate를 사용하시면 대부분의 서버시간이 xe설치시 입력하신 timezone의 값으로 자동계산되어 출력됩니다.
잘 몰랐을때는 타임존값을 서버시간과 초기 설치시 입력한 timezone을 db에서 불러와서 차이값을 계산하고 그걸 다시 최종단계에 적용시키는등... 이런작업을 했었는데요 zdate 함수가 매우 유용하더라구요.
저는 xe 내장 zdate 함수로 한방에 모두 해결했어요.