【PHP8.x】gettimeofday()関数の使い方
gettimeofday関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
gettimeofday関数は、現在の時刻を高精度なマイクロ秒単位で取得する関数です。この関数は、プログラムの処理時間を正確に計測したい場合や、UNIXタイムスタンプにマイクロ秒の情報を追加して詳細な時刻情報を得たい場合に特に役立ちます。
この関数はオプションの引数 $return_as_float を持ちます。この引数を false (デフォルト値) に設定するか省略した場合、現在時刻の情報が連想配列として返されます。返される連想配列には、UNIXタイムスタンプの秒部分を表す sec、マイクロ秒部分を表す usec、グリニッジ標準時からの西への分を表す minuteswest、そして夏時間補正に関する dsttime といった要素が含まれます。これにより、秒単位だけでなく、さらに細かいマイクロ秒単位での時刻情報を得ることが可能です。
一方、$return_as_float 引数に true を設定して呼び出すと、現在時刻がfloat(浮動小数点数)型で返されます。このfloat値は、UNIXタイムスタンプの秒部分とマイクロ秒部分を結合した形式で表現され、例えば「1678886400.123456」のように、秒の後にマイクロ秒が小数点以下として続きます。この形式は、特に実行時間の計測や異なる時点間の時間差を計算する際に、扱いやすく便利です。
PHP 8環境では、この関数の振る舞いは安定しており、システムが提供する最新の時刻情報を利用します。高精度な時刻情報を必要とする様々なアプリケーション開発で活用できる基本的な関数の一つです。
構文(syntax)
1<?php 2gettimeofday(true); 3?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
array|float
現在の時刻をマイクロ秒単位まで含む配列、または秒単位までの浮動小数点数で返します。
サンプルコード
gettimeofday()で高精度な時刻を取得する
1<?php 2 3/** 4 * 現在の時刻を高精度で取得し、その情報を表示する関数。 5 * 6 * gettimeofday() は、Unix エポックからの経過秒数とマイクロ秒を配列で返します。 7 * システムエンジニアを目指す初心者向けに、各要素の意味をコメントで説明します。 8 */ 9function displayHighPrecisionTime(): void 10{ 11 // gettimeofday() を引数なしで呼び出すと、現在の時刻情報を含む連想配列が返されます。 12 // この配列には、秒 ('sec') とマイクロ秒 ('usec') の情報が含まれます。 13 $timeInfo = gettimeofday(); 14 15 echo "--- gettimeofday() の実行結果 ---" . PHP_EOL; 16 echo "返されたデータの型: " . gettype($timeInfo) . PHP_EOL; // 返されたデータの型を確認 (通常は array) 17 print_r($timeInfo); // 配列の内容を分かりやすく表示 18 19 // 配列の 'sec' キーは、Unix エポック (1970年1月1日 00:00:00 UTC) からの経過秒数です。 20 echo "経過秒数 (sec): " . $timeInfo['sec'] . PHP_EOL; 21 22 // 配列の 'usec' キーは、現在の秒内でのマイクロ秒数 (1秒 = 1,000,000マイクロ秒) です。 23 echo "マイクロ秒 (usec): " . $timeInfo['usec'] . PHP_EOL; 24 25 // 高精度な現在の時刻を浮動小数点数として取得する方法。 26 // 秒とマイクロ秒を合わせて、Unixエポックからの総秒数を小数で表現します。 27 // これは、PHPの microtime(true) 関数が返す形式と類似しており、 28 // 時間差の計算などでよく利用されます。 29 $totalSecondsPrecise = $timeInfo['sec'] + ($timeInfo['usec'] / 1_000_000); 30 echo "高精度な総秒数 (float): " . $totalSecondsPrecise . PHP_EOL; 31 32 echo PHP_EOL; 33 echo "gettimeofday() は、プログラムの実行時間計測など、高精度な時刻が必要な場合によく利用されます。" . PHP_EOL; 34} 35 36// 関数を実行して結果を表示します。 37displayHighPrecisionTime(); 38 39?>
gettimeofday 関数は、現在の時刻を高精度で取得するために使用されます。この関数を引数なしで呼び出すと、現在の時刻情報を含む連想配列が戻り値として返されます。返される配列には、主に二つのキーが含まれます。「sec」は1970年1月1日00:00:00 UTC(Unixエポック)からの経過秒数を、「usec」は現在の秒内でのマイクロ秒数(1秒の100万分の1)を示します。
サンプルコードでは、まずgettimeofday()の戻り値である連想配列の内容を表示し、その後に「sec」と「usec」の値を個別に表示しています。さらに、これらの情報を使って、Unixエポックからの総秒数を浮動小数点数として計算する方法も示しています。これは、secにusecを100万で割った値を加えることで実現され、PHPのmicrotime(true)関数が返す形式に似ています。
gettimeofday関数は、プログラムの実行時間計測や、より正確な時刻情報が必要なシステム開発において役立つ機能です。
gettimeofday()関数は、現在の高精度な時刻情報を主に連想配列で返しますが、戻り値はarrayまたはfloatの可能性がありますのでご注意ください。連想配列の場合、'sec'キーでUnixエポックからの経過秒数を、'usec'キーで現在の秒内でのマイクロ秒数を取得できます。高精度な総秒数を浮動小数点数で利用したい場合は、サンプルコードのように$timeInfo['sec'] + ($timeInfo['usec'] / 1_000_000)と計算することで、microtime(true)関数と同様の形式に変換できます。この計算は、プログラムの実行時間計測など、ミリ秒やマイクロ秒単位の精度が必要な場合に特に重要です。配列から値を取り出す際は、'sec'や'usec'といった正しいキー名を指定するよう注意してください。
PHP gettimeofdayでマイクロ秒タイムスタンプを取得する
1<?php 2 3/** 4 * 現在の時刻を高精度なUNIXタイムスタンプとして取得します。 5 * 6 * gettimeofday() 関数は、現在の時刻に関する情報を配列で返します。 7 * この関数は、その配列に含まれる秒数とマイクロ秒の情報を組み合わせて、 8 * マイクロ秒まで含む浮動小数点数形式のUNIXタイムスタンプを生成します。 9 * 10 * システムエンジニアを目指す初心者の方へ: 11 * UNIXタイムスタンプは、1970年1月1日 00:00:00 UTC(協定世界時)からの経過秒数を表す数値です。 12 * 通常のタイムスタンプは秒単位ですが、gettimeofday() を利用することで、 13 * さらに細かいマイクロ秒(1秒の100万分の1)単位での時刻情報を取得できます。 14 * これは、処理時間の計測やイベントの正確な順序付けが必要な場合に役立ちます。 15 * 16 * @return float マイクロ秒精度まで含む現在のUNIXタイムスタンプ(例: 1678886400.123456) 17 */ 18function getMicrosecondTimestamp(): float 19{ 20 // gettimeofday() を引数なしで呼び出すと、以下のキーを持つ連想配列が返されます。 21 // 'sec': UNIXエポックからの秒数 (整数) 22 // 'usec': 現在の秒内のマイクロ秒 (整数) 23 // 'minuteswest': グリニッジ子午線からの分単位の西方向のオフセット 24 // 'dsttime': 夏時間補正のタイプ 25 $timeOfDayInfo = gettimeofday(); 26 27 // 'sec' (秒数) と 'usec' (マイクロ秒) を組み合わせて、 28 // マイクロ秒精度まで含む浮動小数点数形式のタイムスタンプを生成します。 29 // マイクロ秒を1,000,000で割ることで、秒単位に変換し、秒数に加算します。 30 $microsecondTimestamp = $timeOfDayInfo['sec'] + $timeOfDayInfo['usec'] / 1_000_000; 31 32 return $microsecondTimestamp; 33} 34 35// 関数を実行し、現在のマイクロ秒精度UNIXタイムスタンプを取得して表示します。 36$currentMicroTimestamp = getMicrosecondTimestamp(); 37echo "現在のマイクロ秒精度UNIXタイムスタンプ: " . $currentMicroTimestamp . PHP_EOL; 38 39// 注: このタイムスタンプは非常に正確な時刻情報を提供しますが、 40// 人間が読みやすい形式に変換するには、DateTimeオブジェクトなどの追加処理が必要になる場合があります。 41// 例: echo date('Y-m-d H:i:s.u', $currentMicroTimestamp); は直接動作しないため、 42// DateTime::createFromFormat('U.u', sprintf('%.6F', $currentMicroTimestamp))->format('Y-m-d H:i:s.u') のような変換が必要です。 43 44?>
このPHPのサンプルコードは、現在の時刻をマイクロ秒単位まで含んだUNIXタイムスタンプとして取得する方法を示しています。gettimeofday関数は、引数なしで呼び出すことで、現在の時刻に関する情報を配列で返します。この戻り値の配列には、1970年1月1日 00:00:00 UTCからの経過秒数を表すsecキーと、現在の秒内におけるマイクロ秒数を表すusecキーが含まれています。
UNIXタイムスタンプは、前述の基準時からの経過秒数を表す数値ですが、通常のタイムスタンプは秒単位です。gettimeofday関数を利用することで、さらに細かいマイクロ秒(1秒の100万分の1)単位での時刻情報を取得できます。
サンプルコードでは、getMicrosecondTimestampという独自の関数を定義し、その中でgettimeofday()を呼び出しています。そして、取得した配列のsec(秒数)とusec(マイクロ秒)を組み合わせて、マイクロ秒を1,000,000で割って秒に変換し、それをsecに加算することで、浮動小数点数形式のマイクロ秒精度UNIXタイムスタンプを生成しています。
したがって、このgetMicrosecondTimestamp関数は引数を必要とせず、現在の時刻をマイクロ秒精度で表す浮動小数点数(float)として返します。この高精度なタイムスタンプは、プログラムの処理時間の詳細な計測や、イベントの厳密な順序付けが必要な場面で非常に役立ちます。
gettimeofday()関数を引数なしで実行すると、秒数とマイクロ秒を含む連想配列が返されます。サンプルコードは、この配列の秒数とマイクロ秒を組み合わせて、マイクロ秒単位まで正確なUNIXタイムスタンプを浮動小数点数として生成しています。これは、処理速度の計測など、非常に高精度な時刻情報が必要な場面で役立ちます。ただし、このマイクロ秒精度を持つ浮動小数点数形式のタイムスタンプを、人間が読みやすい形式に変換する際には注意が必要です。標準のdate()関数ではマイクロ秒部分が正しく処理されないため、DateTime::createFromFormat('U.u', ...)のように、マイクロ秒まで考慮できるDateTimeオブジェクトを利用して変換するようにしてください。