phpのマイクロ秒取得で、ユニークユーザーIDを割り振る方法

Pocket
LINEで送る
GREE にシェア
LinkedIn にシェア

PHPの使いづらいマイクロ秒取得関数

PHPでは、年月日時分秒はdate関数で取得できますが、それよりも細かいmicro秒は、microtime関数で取得します。

※この記事を書いていた時の時間が表示されています。
 

マイクロ秒の返り値は、[小数点以下の秒(いわゆるマイクロ秒) , UNIX時間]
という値で取得されます。
 

通常は、この取得した値を、” “(半角スペース)で分割して、前方と後方で値を取るのですが、前方だけが買えればいいのに、後方はもはやいらんでしょ。
 

 

ちなみに、UNIX時間は、1970年から今現在までの秒数ですが、この値は、time関数で取得できます。
 

ちょっぴり使いやすくした関数作成

 

使い方は、以下の通り

 

デフォルトでは、3桁のマイクロタイムの数値を文字列で返します。
桁数は、受け渡し値で指定してあげるだけなので、適度な値を渡してあげるといいでしょう。

アクセスの多いサイトでのユニークユーザーIDの構築方法

そもそも、「このマイクロ秒っていつどんな時に使うんだい???」っていう方がいるかもしれないので、簡単に説明。
 

WEBサービスを運営していると、必ずログ情報が必要になる場合があります。
これは、システムログからエラーが出力された場合、「◯年◯月◯日◯時◯分◯秒」という時刻にどんなエラーが発生したかが見られますが、秒間に複数人のアクセスがある場合は、細かく分類しようとすると、プログラム側でログを作り出す必要があります。
 

ただ、秒単位で複数アクセスがあるようなサービスの場合は、ログの数が半端ないので、そんなことをしても、閲覧しきれないでしょうが・・・
 

あともう一つ有用なのが、「ユーザーIDのユニーク性担保」です。
 

ユーザー登録の際に同一タイミングの場合をなるべく避けるために、秒よりも細かい値で取得します。
 

それをクッキーに保持させておくことで、サーバー側でトラッキングできるようにします。
 

もちろん、YmdHisのように秒単位でも構いませんが、1秒間に複数人が登録した場合、同じユーザーIDが振り当てられ、システムとしては破綻してしまいます。
 

または、排他処理を行なってYmdHis-1 , YmdHis-2という風に連番処理を入れてもいいですが、フロントサーバーがバランシングされて複数台になってしまっている場合の連番処理は非常に困難でしょう。
 

こんな時には、もっと細かな値のmicro-timeを使うのがいいでしょう。
 

そして万が一ドンピシャタイミングのユーザーがいた時のために、その後に3桁ぐらいの乱数をくっつけてあげると、天文学的に重複は皆無な状態まで持っていけます。
 

もちろん、100%の重複が無いわけではなく、宝くじを10回続けて1等を当てるぐらいの確率で重複するかもしれません。
 

なんなら、その時のIPアドレス値などを付随させると、100%になるかもしれませんね。
 

こうすると、1000分の1秒のさらに1000分の1で、同一IPアドレスからのアクセスでない限り同一IDにはなりません。
 

秒間100万アクセスぐらいのbotでやられたら、重複が出ちゃいますけど、むしろそれは除外する施策を練りましょう。
 

GoogleのユニークIDを確認

ちなみに、ブラウザのWEBコンソールを使ってGoogleは、クッキーを見た所、

GA1.2.1186836726.1515298391

というような値をGoogleAnalyticsで付与しているので、「アクセスサーバー、連番、マイクロ秒、UNIXタイム」という構成に見えますね。
サーバー毎の連番の時点で100%重複がありません。
 

WEBマーケティング業界はこうして日々進歩していきます。遅れるな!!!

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です