PHPの使いづらいミリ秒取得関数
PHPでは、年月日時分秒はdate関数で取得できますが、それよりも細かいmicro秒は、microtime関数で取得します。
# 年月日時分秒の取得
echo date(“YmdHis”);
> 20180322175356
# ミリ秒の取得
echo microtime();
> 0.55449600 1521708836
※この記事を書いていた時の時間が表示されています。
ミリ秒の返り値は、[小数点以下の秒(いわゆるミリ秒) , UNIX時間]
という値で取得されます。
通常は、この取得した値を、” “(半角スペース)で分割して、前方と後方で値を取るのですが、前方だけが買えればいいのに、後方はもはやいらんでしょ。
echo explode(“ “,microtime)[0];
> 0.55449600
ちなみに、UNIX時間は、1970年から今現在までの秒数ですが、この値は、time関数で取得できます。
echo time();
> 1521708836
ちょっぴり使いやすくした関数作成
// 任意桁(デフォルト3桁)のmicrotimeを返す
function getMtime($digits=3){
list($mic, $sec) = explode(" ", microtime());
$pow = pow(10 ,$digits);
$val_mic = sprintf("%0".$digits."d",(int)($mic * $pow));
return $val_mic;
}
使い方は、以下の通り
echo getMtime();
echo getMtime(4);
echo getMtime(8);
> 029
> 0320
> 03211000
デフォルトでは、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マーケティング業界はこうして日々進歩していきます。遅れるな!!!
0 件のコメント:
コメントを投稿