【PHP8.x】CURLINFO_STARTTRANSFER_TIME_T定数の使い方
CURLINFO_STARTTRANSFER_TIME_T定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
CURLINFO_STARTTRANSFER_TIME_T定数は、PHPのcURL拡張機能において、ファイルやデータの転送が実際に開始された時刻をマイクロ秒単位で表す定数です。
この定数は、curl_getinfo()関数と組み合わせて使用され、Webサーバーからのレスポンスデータを受け取り始めた正確な時点を取得するために利用されます。これは、名前解決、TCP接続の確立、SSL/TLSハンドシェイク、およびHTTPリクエストの送信にかかる時間を除いた、純粋なデータ転送の開始時刻を指します。例えば、外部APIへのリクエストを行う際に、ネットワークの接続にかかる時間とデータ受信の開始までに要する時間を区別したい場合に役立ちます。
取得される値はfloat型で提供され、通常は秒単位の小数で、非常に高い精度で転送開始時刻を把握することができます。具体的には、cURLリクエスト全体の処理時間の中で、いつから実際のデータ受信が始まったのかを詳細に分析する際に有用です。
システムエンジニアがWebアプリケーションのパフォーマンスを監視したり、ネットワーク通信のデバッグや最適化を行ったりする際、この定数から得られる情報を使うことで、データ転送のボトルネックを特定し、アプリケーション全体の応答性向上に貢献できます。開発者は、この情報を用いて、外部サービスとの連携における時間的な挙動を深く理解することが可能になります。
構文(syntax)
1<?php 2echo CURLINFO_STARTTRANSFER_TIME_T; 3?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
この定数は、転送が開始されるまでの経過時間を秒単位の整数で返します。
サンプルコード
PHP: curl_starttransfer_time_tで転送開始時間を取得する
1<?php 2 3/** 4 * 指定されたURLへのcURLリクエストの最初のバイトが受信されるまでの時間を取得します。 5 * この時間は、DNS解決、TCP接続、TLSハンドシェイク(HTTPSの場合)に加えて、 6 * サーバーがリクエストを処理し始め、最初のデータバイトを送信するまでの時間を含みます。 7 * 8 * @param string $url 情報を取得するターゲットURL 9 * @return int|null 最初のバイトが受信されるまでの時間(マイクロ秒)、またはエラーの場合はnull 10 */ 11function getCurlStartTransferTimeMicroseconds(string $url): ?int 12{ 13 // cURLセッションを初期化 14 $ch = curl_init(); 15 16 if ($ch === false) { 17 error_log("cURLの初期化に失敗しました。"); 18 return null; 19 } 20 21 // ターゲットURLを設定 22 curl_setopt($ch, CURLOPT_URL, $url); 23 // 戻り値を文字列として取得する(画面に直接出力しない) 24 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 25 // ヘッダー情報を含めない 26 curl_setopt($ch, CURLOPT_HEADER, false); 27 28 // cURLリクエストを実行 29 $response = curl_exec($ch); 30 31 // リクエストが失敗したかチェック 32 if ($response === false) { 33 error_log("URL '{$url}' へのcURLリクエストでエラーが発生しました: " . curl_error($ch)); 34 curl_close($ch); 35 return null; 36 } 37 38 // CURLINFO_STARTTRANSFER_TIME_T を使用して、最初のバイトが転送されるまでの時間をマイクロ秒単位で取得 39 // これはPHP 8で追加された、より正確な時間情報を提供する定数です。 40 $startTimeMicroseconds = curl_getinfo($ch, CURLINFO_STARTTRANSFER_TIME_T); 41 42 // cURLセッションを終了 43 curl_close($ch); 44 45 // 取得した値が整数であることを確認して返す 46 return is_int($startTimeMicroseconds) ? $startTimeMicroseconds : null; 47} 48 49// 例: Googleのホームページへのリクエストで「最初のバイトが受信されるまでの時間」を測定 50$targetUrl = "https://www.google.com"; 51$time = getCurlStartTransferTimeMicroseconds($targetUrl); 52 53if ($time !== null) { 54 echo "ターゲットURL: " . $targetUrl . "\n"; 55 echo "最初のバイトが受信されるまでの時間: " . $time . " マイクロ秒\n"; 56 echo "(約 " . round($time / 1000, 2) . " ミリ秒)\n"; 57} else { 58 echo "cURLリクエストの実行中にエラーが発生したか、情報が取得できませんでした。\n"; 59}
PHP 8で導入されたCURLINFO_STARTTRANSFER_TIME_Tは、cURLによるWebリクエストにおいて、サーバーから最初のデータバイトが受信されるまでの経過時間を取得するための定数です。この時間は、DNS解決、TCP接続の確立、HTTPS通信におけるTLSハンドシェイク、そしてサーバーがリクエストを処理して最初のデータを送信し始めるまでの全体を含みます。
この定数には引数はなく、curl_getinfo()関数と組み合わせて使用することで、int型の値としてマイクロ秒単位の時間が返されます。サンプルコードでは、特定のURLに対してcURLリクエストを実行した後、curl_getinfo($ch, CURLINFO_STARTTRANSFER_TIME_T)を呼び出してこの高精度な時間情報を取得しています。これにより、Webサイトの応答性能を詳細に分析することが可能です。cURLリクエストが失敗した場合や情報が取得できない場合はnullが返されることがあります。
CURLINFO_STARTTRANSFER_TIME_TはPHP 8以降のバージョンで利用可能である点に注意し、必ず動作環境のPHPバージョンを確認してください。取得される時間はマイクロ秒単位なので、必要に応じてミリ秒などへ変換すると分かりやすいでしょう。
cURLリクエストの実行には失敗のリスクが伴います。そのため、curl_initやcurl_execの戻り値を必ず確認し、エラー時はcurl_error()で詳細を把握して適切なエラー処理を実装してください。curl_close()によるリソース解放は、処理の成功・失敗に関わらず確実に行うことが重要です。また、CURLOPT_RETURNTRANSFERの設定がないと、レスポンスが直接出力されてしまうため、変数で受け取る場合は必ず有効にしてください。これらの基本を押さえることで、安全で堅牢なコードになります。
PHP cURLでHTTPステータスコードと転送開始時刻を取得する
1<?php 2 3/** 4 * cURL を使って指定されたURLにアクセスし、 5 * HTTPステータスコードと転送開始時のタイムスタンプ情報を取得・表示します。 6 * 7 * @param string $url アクセスするターゲットのURL 8 * @return void 9 */ 10function getCurlTransferInformation(string $url): void 11{ 12 // 1. cURL セッションを初期化します。 13 // これにより、ウェブサーバーとの通信を行うためのハンドルが作成されます。 14 $ch = curl_init(); 15 16 if ($ch === false) { 17 echo "エラー: cURL の初期化に失敗しました。\n"; 18 return; 19 } 20 21 // 2. cURL のオプションを設定します。 22 // CURLOPT_URL: アクセスするURLを指定します。 23 // CURLOPT_RETURNTRANSFER: cURL_exec() の実行結果を直接出力せず、文字列として返すように設定します。 24 // CURLOPT_TIMEOUT: cURL リクエストのタイムアウト時間を秒単位で設定します。 25 curl_setopt($ch, CURLOPT_URL, $url); 26 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 27 curl_setopt($ch, CURLOPT_TIMEOUT, 10); 28 29 // 3. cURL セッションを実行し、ウェブサーバーからレスポンスを取得します。 30 $response = curl_exec($ch); 31 32 // 4. エラーが発生した場合は、その内容を表示します。 33 if ($response === false) { 34 echo "エラー: cURL の実行中に問題が発生しました: " . curl_error($ch) . "\n"; 35 } else { 36 echo "--- cURL 転送情報 ---\n"; 37 echo "アクセスURL: " . $url . "\n"; 38 39 // キーワードに関連する情報: 40 // CURLINFO_HTTP_CODE: HTTPステータスコード (例: 200 OK, 404 Not Found など) を取得します。 41 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 42 echo "HTTP ステータスコード: " . $httpCode . "\n"; 43 44 // リファレンス情報に関連する情報: 45 // CURLINFO_STARTTRANSFER_TIME_T: 転送が開始されたときの Unix タイムスタンプをマイクロ秒単位で取得します。 46 // ※提供されたリファレンス情報では「戻り値: int」とありますが、 47 // 実際のPHPの挙動では float 型で返されることが一般的です。 48 $startTransferTimeT = curl_getinfo($ch, CURLINFO_STARTTRANSFER_TIME_T); 49 echo "転送開始時のUnixタイムスタンプ (マイクロ秒): " . $startTransferTimeT . "\n"; 50 51 // 初心者向けに、上記のマイクロ秒単位のタイムスタンプを人間が読める形式に変換して表示する例 52 // (PHP 8 では DateTimeImmutable クラスとマイクロ秒の扱いが改善されています) 53 $seconds = floor($startTransferTimeT / 1_000_000); 54 $microseconds = (int)($startTransferTimeT - ($seconds * 1_000_000)); 55 56 $dateTime = (new DateTimeImmutable())->setTimestamp($seconds); 57 $dateTime = $dateTime->setTime( 58 (int)$dateTime->format('H'), 59 (int)$dateTime->format('i'), 60 (int)$dateTime->format('s'), 61 $microseconds 62 ); 63 echo "転送開始日時 (人間が読める形式): " . $dateTime->format('Y-m-d H:i:s.u') . "\n"; 64 65 echo "取得したコンテンツの最初の100文字:\n"; 66 echo "-------------------------------------\n"; 67 // マルチバイト文字に対応するため mb_substr を使用 68 echo mb_substr($response, 0, 100) . (mb_strlen($response) > 100 ? '...' : '') . "\n"; 69 echo "-------------------------------------\n"; 70 } 71 72 // 5. cURL セッションを閉じ、リソースを解放します。 73 curl_close($ch); 74} 75 76// サンプルとして、一般的なウェブサイトの情報を取得してみましょう。 77// 動作確認のため、アクセス可能なURLを指定してください。 78getCurlTransferInformation("https://www.example.com"); 79
このPHPサンプルコードは、PHPのcURL拡張機能を利用して、指定されたURLへアクセスし、その際のHTTPステータスコードとデータ転送開始時のタイムスタンプ情報を取得・表示するものです。
まず、curl_init()関数で新しいcURLセッションを開始し、ウェブサーバーとの通信準備を整えます。次に、curl_setopt()関数を使って、アクセスするURL、レスポンスを直接出力せず文字列として取得する設定、タイムアウト時間などの詳細な通信オプションを設定します。
設定が完了したら、curl_exec()関数を実行することで実際のウェブ通信が行われ、サーバーからの応答が取得されます。通信中にエラーが発生した場合は、その旨が表示されます。
通信が成功した場合、curl_getinfo()関数を使用して、セッションに関する詳細な情報を取得します。ここで重要なのは、CURLINFO_HTTP_CODEとCURLINFO_STARTTRANSFER_TIME_Tです。CURLINFO_HTTP_CODEは、HTTP通信がどのような結果になったかを示すステータスコード(例: 200 OK, 404 Not Foundなど)を整数値で返します。これにより、サーバーがリクエストを適切に処理したかどうかが判断できます。
一方、CURLINFO_STARTTRANSFER_TIME_Tは、ウェブサーバーからのデータ転送が実際に開始された時点のUnixタイムスタンプをマイクロ秒単位で整数値として返します。この情報は、転送にかかった時間を分析したり、ログに記録したりする際に役立ちます。提供されたリファレンスでは戻り値がintですが、PHPの実際の挙動ではより高い精度を保つためfloat型で返される場合があります。
最後に、curl_close()関数でcURLセッションを終了し、使用したリソースを解放します。この関数は引数としてアクセス対象のURL(string型)を受け取りますが、特定の値を返しません(void)。
CURLINFO_STARTTRANSFER_TIME_Tはリファレンス上でintと記載がありますが、実際のPHPではマイクロ秒を含むfloat型で返されることが多いです。サンプルコードのようにDateTimeImmutableクラスを使うと、その値を正確な日時に変換できます。cURLの初期化や実行は失敗する可能性があるため、curl_init()やcurl_exec()の戻り値を必ず確認し、エラー時はcurl_error()で詳細を取得し適切に処理してください。また、通信処理後は必ずcurl_close()を呼び出し、リソースを解放することがプログラムの安定稼働に不可欠です。アクセスするURLの信頼性を常に確認すること、そしてCURLOPT_TIMEOUTで適切なタイムアウト時間を設定することで、意図しない挙動やリソース枯渇を防ぎ、安全で堅牢なコードを記述できます。