blog.stackframe.dev

현재 Unix time 밀리초 단위로 가져오기

로그를 남길 때 시각을 Unix time(epoch)로 남기면 기준 시간대가 달라져도 쉽게 변환이 가능하므로 편리하다. 다만 접속이 많은 서버라면 같은 시각에 여러 로그가 기록될 가능성이 높고, 데이터베이스에서 정렬을 하더라도 실제로 기록된 순서대로 정렬되지 않는 문제가 있다.

그러므로 나는 초 단위에서 밀리초 단위로 해상도를 높히려고 한다. PHP에서는 초 단위의 Unix time은 time() 함수로 가져올 수 있고, 마이크로초가 포함된 시각은 microtime() 함수로 가져온다. 여기서는 microtime()으로 마이크로초를 가져와서 밀리초로 변환하여 사용하면 된다:

<?php
$millisec = (int)(microtime(TRUE) * 1000);
var_dump($millisec);
var_dump($time);

실행 결과:

int(1627607610302)
int(1627607610)

`포함된` 단어를 강조한 이유가 바로 microtime() 함수는 마이크로초 단위로 시각을 반환하지 않기 때문이다. 기본 초 단위에 그 이하는 소수점인 float 타입의 값을 반환한다. 그렇기 때문에 microtime() 값에 1000을 곱하고 int로 형변환을 하면 마이크로초의 시각이 나온다.

참고로 PHP의 기본 변수인 $_SERVER 배열의 REQUEST_TIME_FLOAT 키에 PHP가 실행된 시각의 마이크로초를 포함하는 float 값이 들어있다. 이 값을 위와 동일한 방법으로 변환하여 사용해도 된다. 프레임워크나 다른 작업을 수행하느라 실제 요청이 들어온 시각과 접속 로그를 기록하는 때의 괴리가 생긴 경우 이 서버 변수를 사용하는 것을 고려할 수 있다.

댓글