【PHP8.x】CURLINFO_PRETRANSFER_TIME_T定数の使い方
CURLINFO_PRETRANSFER_TIME_T定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
CURLINFO_PRETRANSFER_TIME_T定数は、PHPのcURL拡張機能において、HTTPなどのネットワーク転送に関する特定の時間情報を取得するために使用される定数です。この定数は、プログラムが外部のWebサービスなどと通信を開始してから、実際にデータの転送が始まるまでの時間を、通常はマイクロ秒単位で表します。具体的には、名前解決(ドメイン名をIPアドレスに変換する処理)やTCPコネクションの確立、そしてHTTPS通信の場合はSSL/TLSハンドシェイクといった、データ転送の前段階で必要となる準備にかかった総時間を計測します。
この情報は、Webアプリケーションのパフォーマンス分析において非常に重要です。例えば、外部APIへのリクエストが遅いと感じた場合、データ転送前の準備段階に時間がかかっているのか、それともデータ転送そのものに時間がかかっているのかを区別することで、問題の根本原因を特定する手助けとなります。ネットワークの遅延や、対象サーバーの初期応答、セキュリティプロトコルの処理速度など、様々な要素がこの時間に影響を与えます。CURLINFO_PRETRANSFER_TIME_Tを利用することで、より詳細な通信状況を把握し、システムの最適化やデバッグに役立てることが可能です。PHP 8からは、この値がより高精度な時間情報として扱われるようになりました。
構文(syntax)
1<?php 2$ch = curl_init("http://example.com"); 3curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 4curl_exec($ch); 5 6$pretransfer_time_microseconds = curl_getinfo($ch, CURLINFO_PRETRANSFER_TIME_T); 7 8curl_close($ch); 9?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP cURL 事前転送時間を取得する
1<?php 2 3/** 4 * cURLを使用して指定されたURLの事前転送時間(pre-transfer time)を測定します。 5 * 6 * 事前転送時間とは、cURLリクエストが開始されてから、 7 * 実際にデータ転送が開始されるまでの時間(DNS解決、TCP接続、SSLハンドシェイクなど)を指します。 8 * CURLINFO_PRETRANSFER_TIME_T 定数は、この時間をマイクロ秒単位の整数で返します。 9 * (PHP 8.0以降で利用可能) 10 * 11 * @param string $url 測定対象のURL 12 * @return void 13 */ 14function measurePretransferTime(string $url): void 15{ 16 // cURLセッションを初期化します。 17 $ch = curl_init(); 18 19 // cURLの初期化に失敗した場合のエラー処理 20 if ($ch === false) { 21 echo "エラー: cURLの初期化に失敗しました。\n"; 22 return; 23 } 24 25 // 転送するURLを設定します。 26 curl_setopt($ch, CURLOPT_URL, $url); 27 // 転送結果を文字列として返すように設定します。 28 // (ここでは時間計測が目的のため、結果自体は使用しません) 29 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 30 // ヘッダー情報を含まないように設定します。 31 curl_setopt($ch, CURLOPT_HEADER, false); 32 33 // cURL転送を実行します。 34 // 時間情報を取得するためには、実際に転送を試みる必要があります。 35 curl_exec($ch); 36 37 // 事前転送時間(マイクロ秒単位)を取得します。 38 // CURLINFO_PRETRANSFER_TIME_T を使用することで、より高精度な整数値を取得できます。 39 $pretransferTimeMicroseconds = curl_getinfo($ch, CURLINFO_PRETRANSFER_TIME_T); 40 41 // cURLセッションを閉じ、関連するリソースを解放します。 42 curl_close($ch); 43 44 // 取得した時間を表示します。 45 if ($pretransferTimeMicroseconds !== false) { 46 echo "URL: " . $url . "\n"; 47 echo "事前転送時間 (マイクロ秒): " . $pretransferTimeMicroseconds . "\n"; 48 // 初心者にも分かりやすいように秒単位に変換して表示します。 49 echo "事前転送時間 (秒): " . sprintf("%.6f", $pretransferTimeMicroseconds / 1_000_000) . "秒\n"; 50 } else { 51 echo "エラー: 事前転送時間の取得に失敗しました。\n"; 52 } 53} 54 55// サンプルとして、一般的なウェブサイトの事前転送時間を測定します。 56measurePretransferTime("https://www.example.com"); 57 58?>
このサンプルコードは、PHPのcURL拡張機能を利用して、指定されたウェブサイトへの「事前転送時間」を計測する方法を示しています。
「事前転送時間」とは、cURLリクエストが開始されてから、実際にデータの転送が始まるまでの間にかかる時間のことです。具体的には、DNS(ドメイン名解決)、TCP(ネットワーク接続の確立)、SSL/TLS(暗号化通信のハンドシェイク)といった、データを送受信する前の準備にかかる時間を指します。CURLINFO_PRETRANSFER_TIME_Tは、この事前転送時間をマイクロ秒単位の整数として取得するためのcURL情報定数です。PHP 8.0以降で利用でき、従来の秒単位の浮動小数点数よりも高精度な時間情報を提供します。
measurePretransferTime関数は、測定したいURLを文字列($url)で引数に受け取ります。関数内部では、まずcURLセッションを初期化し、指定されたURLに対するオプションを設定して転送を実行します。転送完了後、curl_getinfo関数にCURLINFO_PRETRANSFER_TIME_T定数を渡すことで、事前転送時間がマイクロ秒単位で取得されます。取得された時間は画面に表示されますが、関数自体は値を返しません(void)。このコードは、ウェブサイトへの接続準備にかかる時間を理解し、パフォーマンス改善の指標とする際に役立ちます。
CURLINFO_PRETRANSFER_TIME_TはPHP 8.0以降で利用可能で、それ以前のバージョンでは動作しません。時間情報はcurl_exec()実行後に取得し、エラー時はfalseを返すため必ずエラーチェックを行ってください。取得値はマイクロ秒単位の整数なので、秒への変換時は100万で割ります。処理後はcurl_close()でセッションを閉じ、リソース解放が必須です。この値はネットワーク状況により変動し、ウェブサイトの初期接続性能測定に役立ちます。
PHP cURLでHTTPコードと転送前処理時間を取得する
1<?php 2 3/** 4 * 指定されたURLに対してcURLリクエストを実行し、 5 * HTTPステータスコードと転送前処理にかかった時間を表示します。 6 * この関数は、ウェブサイトへの接続状況や初期応答速度を測定する際の 7 * 基本的な情報を取得する方法を、システムエンジニアの初心者向けに示します。 8 * 9 * CURLINFO_PRETRANSFER_TIME_T 定数は、名前解決、TCP接続、SSLハンドシェイクなど、 10 * 実際にデータ転送が開始されるまでの処理にかかった時間をマイクロ秒単位で返します。 11 * CURLINFO_HTTP_CODE 定数は、リクエストに対するHTTPステータスコードを返します。 12 * 13 * @param string $url リクエストを送信するターゲットURL。 14 * @return bool cURLリクエストの実行と情報取得が成功した場合はtrue、失敗した場合はfalse。 15 */ 16function getCurlTransferMetrics(string $url): bool 17{ 18 // 1. cURLセッションを初期化します。 19 // curl_init() は新しいcURLセッションを開始し、ハンドルを返します。 20 $ch = curl_init(); 21 22 // 初期化に失敗した場合のハンドリング 23 if ($ch === false) { 24 echo "エラー: cURLセッションの初期化に失敗しました。\n"; 25 return false; 26 } 27 28 // 2. cURLオプションを設定します。 29 // CURLOPT_URL: リクエストを送信するURLを設定します。 30 curl_setopt($ch, CURLOPT_URL, $url); 31 // CURLOPT_RETURNTRANSFER: curl_exec() が結果を文字列として返すように設定します。 32 // これにより、結果が直接出力されず、変数に格納できます。 33 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 34 // CURLOPT_TIMEOUT: cURL操作の最大実行時間を秒単位で設定します。 35 curl_setopt($ch, CURLOPT_TIMEOUT, 10); 36 // CURLOPT_CONNECTTIMEOUT: 接続確立の最大待機時間を秒単位で設定します。 37 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); 38 39 // 3. cURLリクエストを実行します。 40 // curl_exec() は設定されたオプションに基づいてリクエストを実行します。 41 $response = curl_exec($ch); 42 43 // 4. エラーが発生したか確認します。 44 if ($response === false) { 45 // curl_error() は直近のcURL操作のエラーメッセージを返します。 46 echo "エラー: cURLリクエストの実行中に問題が発生しました: " . curl_error($ch) . "\n"; 47 // curl_close() でcURLセッションを閉じ、リソースを解放します。 48 curl_close($ch); 49 return false; 50 } 51 52 // 5. 必要なcURL情報を取得します。 53 // curl_getinfo() はcURL転送に関する情報を取得するために使用されます。 54 // CURLINFO_HTTP_CODE: 最後に受信したHTTPステータスコードを取得します。 55 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 56 // CURLINFO_PRETRANSFER_TIME_T: 転送開始までの前処理時間(マイクロ秒単位)を取得します。 57 $pretransferTimeMicroseconds = curl_getinfo($ch, CURLINFO_PRETRANSFER_TIME_T); 58 59 // 6. 取得した情報を表示します。 60 echo "--- cURL転送メトリクス ---\n"; 61 echo "URL: " . $url . "\n"; 62 echo "HTTPステータスコード: " . $httpCode . "\n"; 63 echo "転送前処理時間 (マイクロ秒): " . $pretransferTimeMicroseconds . "\n"; 64 // マイクロ秒を秒に変換して表示すると、より分かりやすくなります。 65 echo "転送前処理時間 (秒): " . ($pretransferTimeMicroseconds / 1000000) . "秒\n"; 66 echo "--------------------------\n"; 67 68 // 7. cURLセッションを閉じ、リソースを解放します。 69 curl_close($ch); 70 71 return true; 72} 73 74// サンプル使用例: 実際のURLを指定して関数を呼び出します。 75getCurlTransferMetrics("https://www.example.com"); 76 77// 存在しないURLやエラーが発生する可能性のあるURLでのテストも可能です。 78// getCurlTransferMetrics("https://nonexistent-domain-12345.com");
このPHPサンプルコードは、cURLという機能を使って、指定したウェブサイトにアクセスし、その応答状況に関する重要な情報を取得・表示する方法を示しています。システムエンジニアを目指す初心者の方が、ウェブサイトの接続状況や初期応答速度を測定する基礎を理解するのに役立ちます。
具体的には、getCurlTransferMetrics関数は、引数として受け取った$urlに対してcURLリクエストを送信します。リクエストの実行後、CURLINFO_HTTP_CODE定数を用いて、アクセスしたウェブサイトからの応答が「200 OK」のようなHTTPステータスコードとして正常だったかを確認します。さらに、CURLINFO_PRETRANSFER_TIME_T定数を使用することで、名前解決、TCP接続、SSLハンドシェイクなど、実際にデータの転送が始まるまでの準備にかかった時間をマイクロ秒単位で取得できます。これは、ウェブサイトの初期応答にどれくらいの時間がかかっているかを知る上で非常に重要な指標です。
コードの流れとしては、まずcurl_init()でcURLセッションを開始し、curl_setopt()でアクセス先のURLやデータ取得方法などの詳細な設定を行います。その後、curl_exec()でリクエストを実際に実行し、curl_getinfo()でHTTPステータスコードや転送前処理時間といった情報を取得します。もし処理中に問題が発生した場合はcurl_error()でエラーメッセージを表示し、最終的にはcurl_close()でcURLセッションを終了し、使用したリソースを解放します。この関数は、処理が成功した場合はtrueを、失敗した場合はfalseを戻り値として返します。
cURL操作ではネットワーク通信が伴うため、curl_init()やcurl_exec()の戻り値を必ず確認し、エラーハンドリングを行うことが重要です。処理が終わったら、curl_close()でリソースを確実に解放してください。CURLOPT_TIMEOUTやCURLOPT_CONNECTTIMEOUTは、リクエストが応答しない場合にプログラムが停止しないよう、適切な値を設定することが推奨されます。CURLINFO_PRETRANSFER_TIME_Tはマイクロ秒単位で取得されるため、必要に応じて秒に変換して利用すると分かりやすいでしょう。HTTPSサイトへ接続する際は、セキュリティ確保のため、SSL証明書の検証(CURLOPT_SSL_VERIFYPEERなど)を無効にしないように注意してください。これはデフォルトで有効です。