【PHP8.x】dns_check_record()関数の使い方
dns_check_record関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
dns_check_record関数は、指定されたホスト名またはIPアドレスのDNS (Domain Name System) レコードが存在するかどうかを確認する関数です。この関数は、Webサイトのドメインやメールサーバーのホスト名などが、DNS上で適切に登録されているかをチェックしたい場合に非常に役立ちます。
関数を使用する際には、最初にチェックしたいホスト名またはIPアドレスを文字列として渡します。必要に応じて、第二引数としてDNSレコードのタイプを文字列で指定することも可能です。たとえば、「MX」(メールエクスチェンジャー)レコードを指定して、そのドメインがメールサーバーを持っているかを確認したり、「A」(アドレス)レコードを指定して、IPアドレスへのマッピングが存在するかを確認したりできます。他にも、「NS」(ネームサーバー)、「CNAME」(正規名)、「TXT」(テキスト)、「AAAA」(IPv6アドレス)など、様々なレコードタイプをチェックできます。
指定したDNSレコードが実際に存在すれば、この関数は論理値の true を返します。もしレコードが存在しない場合や、DNSサーバーとの通信に問題があった場合は論理値の false を返します。この関数は、DNSレコードの具体的な情報を取得するものではなく、あくまで「存在するか否か」のみを判定することに注意してください。したがって、ドメインが有効であるか、あるいは特定のサービスが利用可能であるかをシンプルに確認したい場合に、この dns_check_record 関数は非常に便利なツールとなります。
構文(syntax)
1<?php 2// ホスト名に指定されたDNSレコードタイプが存在するかどうかを確認します。 3// 存在すれば true、存在しなければ false を返します。 4 5$hostname = "example.com"; // 確認したいホスト名 6$type = "A"; // 確認したいDNSレコードタイプ (例: "A", "MX", "NS", "TXT") 7 8if (dns_check_record($hostname, $type)) { 9 echo "ホスト名 '{$hostname}' に {$type} レコードが存在します。\n"; 10} else { 11 echo "ホスト名 '{$hostname}' に {$type} レコードは存在しません。\n"; 12} 13?>
引数(parameters)
string $hostname, string $type = 'MX'
- string $hostname: チェック対象のホスト名(ドメイン名)を指定する文字列
- string $type = 'MX': 取得するDNSレコードの種類を指定する文字列。デフォルトは'MX'(Mail Exchanger)
戻り値(return)
bool
指定されたホスト名に対してDNSレコードの存在を確認し、成功した場合はTRUEを、失敗した場合はFALSEを返します。
サンプルコード
PHPでDNSレコードの存在チェックと詳細取得
1<?php 2 3// 目的: DNSレコードの存在チェックと、必要に応じて詳細情報を取得します。 4 5/** 6 * 指定されたホスト名のDNSレコードが存在するかチェックし、結果を表示します。 7 * また、関連する詳細情報がある場合はそれも表示します。 8 * 9 * システムエンジニアを目指す初心者向けに、DNSレコードの基本的な確認方法と、 10 * より詳細な情報を取得する方法を示します。 11 * 12 * @param string $hostname チェック対象のホスト名(例: "example.com") 13 * @param string $type チェックするDNSレコードのタイプ(例: "A", "MX", "NS", "TXT", "AAAA", "SRV" など)。大文字小文字は区別しません。デフォルトは "MX"。 14 * @return void 15 */ 16function checkDnsRecordExistence(string $hostname, string $type = 'MX'): void 17{ 18 echo "--- DNS Record Check for '{$hostname}' (Type: {$type}) ---" . PHP_EOL; 19 20 // dns_check_record: 21 // 指定されたホスト名に対して、特定のDNSレコードタイプ(例: 'MX' や 'A')が 22 // 存在するかどうかを真偽値(true/false)で確認します。 23 // DNSレコードの存在を素早く確認するのに非常に便利です。 24 // 引数: $hostname (string), $type (string) 25 // 戻り値: bool (true: 存在する, false: 存在しない) 26 if (dns_check_record($hostname, $type)) { 27 echo "✅ '{$type}' record EXISTS for '{$hostname}'." . PHP_EOL; 28 29 // キーワード: dns_get_record 30 // dns_get_record: 31 // dns_check_recordで存在が確認されたDNSレコードについて、 32 // その詳細な情報を配列として取得したい場合に利用します。 33 // IPアドレス、優先度、ターゲットなどの詳細なデータが得られます。 34 // 引数: $hostname (string), $type (int) - PHP_DNS_* 定数を使用 35 // 戻り値: array|false (レコードの配列、または失敗時にfalse) 36 37 $phpDnsType = match (strtoupper($type)) { 38 'A' => PHP_DNS_A, // IPv4アドレスレコード 39 'MX' => PHP_DNS_MX, // メールエクスチェンジャーレコード 40 'NS' => PHP_DNS_NS, // ネームサーバーレコード 41 'TXT' => PHP_DNS_TXT, // テキストレコード (SPFなど) 42 'AAAA' => PHP_DNS_AAAA, // IPv6アドレスレコード 43 'SRV' => PHP_DNS_SRV, // サービスロケーターレコード 44 default => null, // このタイプはdns_get_recordで直接指定できないか、一般的ではない 45 }; 46 47 if ($phpDnsType !== null) { // dns_get_recordで取得可能なタイプの場合 48 $records = dns_get_record($hostname, $phpDnsType); 49 if (!empty($records)) { 50 echo " ➡️ Detailed records (using dns_get_record):" . PHP_EOL; 51 foreach ($records as $record) { 52 // 詳細情報を分かりやすいJSON形式で出力 53 echo " " . json_encode($record, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . PHP_EOL; 54 } 55 } else { 56 echo " ⚠️ Could not retrieve detailed records for '{$hostname}' (Type: {$type}) using dns_get_record." . PHP_EOL; 57 } 58 } else { 59 echo " ℹ️ Detailed record retrieval for type '{$type}' is not supported or not applicable in this example context for dns_get_record." . PHP_EOL; 60 } 61 62 } else { 63 echo "❌ '{$type}' record DOES NOT EXIST for '{$hostname}'." . PHP_EOL; 64 } 65 echo PHP_EOL; 66} 67 68// --- サンプル実行 --- 69 70// 例1: 存在するドメインのMXレコードをチェック(dns_check_recordのデフォルトタイプ) 71checkDnsRecordExistence('google.com'); 72 73// 例2: 存在するドメインのAレコードをチェック 74checkDnsRecordExistence('example.com', 'A'); 75 76// 例3: 存在しないドメインのAレコードをチェック 77checkDnsRecordExistence('nonexistent-domain-12345.com', 'A'); 78 79// 例4: 存在するドメインのTXTレコードをチェック 80checkDnsRecordExistence('php.net', 'TXT'); 81 82// 例5: 存在するドメインのNSレコードをチェック 83checkDnsRecordExistence('github.com', 'NS'); 84 85// 例6: SRVレコードのチェック(通常、一般的なドメインには直接設定されていないことが多い) 86checkDnsRecordExistence('microsoft.com', 'SRV');
このPHPサンプルコードは、指定されたホスト名に対してDNSレコードが存在するかどうかを確認し、必要に応じてその詳細情報を取得する方法を、システムエンジニアを目指す初心者向けに示しています。
dns_check_record関数は、特定のホスト名($hostname)に、指定されたタイプのDNSレコード($type、例: 'MX'や'A')が存在するかどうかを真偽値(bool)で判定します。この関数は、レコードが存在すればtrue、存在しなければfalseを返します。これにより、DNSレコードの基本的な有無を素早く確認できます。
一方、dns_get_record関数は、dns_check_recordでレコードの存在が確認された場合に、そのレコードのIPアドレス、優先度、ターゲットなどの詳細な情報を配列として取得する際に利用されます。dns_get_recordの第二引数にはPHP_DNS_AのようなPHP_DNS_*定数を用いてレコードタイプを指定します。この連携により、まずレコードの有無を効率的に確認し、その後、具体的な内容が必要な場合にのみ詳細情報を取得するといった柔軟な処理が可能です。このアプローチは、ドメイン設定の健全性チェックや、ネットワーク関連のトラブルシューティングにおいて非常に有用です。
このコードは、DNSレコードの存在確認と詳細取得の基本を示します。dns_check_recordは指定されたレコードの有無を真偽値で判定するのに対し、dns_get_recordはより詳細な情報を配列として取得します。機能が異なるため、目的に合わせて使い分けましょう。特にdns_get_recordの第2引数は、サンプルにあるようにPHP_DNS_Aのような定数を使用する必要がある点に注意してください。これらの関数はネットワークを介して外部のDNSサーバーに問い合わせを行うため、実行環境のネットワーク接続やDNSサーバーの応答速度に影響されます。存在しないドメインやレコードタイプを指定した場合の戻り値(falseや空の配列)を適切に処理することが重要です。
PHP: dns_check_record でDNSチェックをキャッシュする
1<?php 2 3/** 4 * 指定されたホスト名とDNSレコードタイプが存在するかをチェックし、 5 * 結果をスクリプト実行中にキャッシュすることで、同一条件での問い合わせ回数を削減します。 6 * これにより、外部DNSサーバーへの不要なアクセスを減らし、パフォーマンスを向上させます。 7 * 8 * @param string $hostname チェックするホスト名 (例: 'example.com') 9 * @param string $type チェックするDNSレコードタイプ (例: 'A', 'MX', 'NS', 'TXT', 'AAAA' など)。デフォルトは 'MX'。 10 * @return bool DNSレコードが存在すれば true、そうでなければ false を返します。 11 */ 12function checkDnsRecordWithCache(string $hostname, string $type = 'MX'): bool 13{ 14 // スクリプト実行中にDNSチェックの結果を一時的に保存するための静的変数 15 // このキャッシュはスクリプトの実行が終了するとクリアされます。 16 static array $dnsCache = []; 17 18 // ホスト名とタイプを組み合わせたキャッシュキーを作成します。 19 // これにより、異なるホスト名や異なるタイプのレコードは個別にキャッシュされます。 20 $cacheKey = "{$hostname}_{$type}"; 21 22 // キャッシュに既にこの結果が存在するかどうかを確認します。 23 if (isset($dnsCache[$cacheKey])) { 24 echo "DEBUG: '{$hostname}' (タイプ: {$type}) の結果をキャッシュから取得しました。\n"; 25 // キャッシュに存在する場合は、キャッシュされた値を直接返します。 26 return $dnsCache[$cacheKey]; 27 } 28 29 // キャッシュに存在しない場合、実際に `dns_check_record` 関数を呼び出してDNSレコードをチェックします。 30 echo "DEBUG: '{$hostname}' (タイプ: {$type}) のDNSレコードを問い合わせ中です...\n"; 31 $result = dns_check_record($hostname, $type); 32 33 // 取得した結果をキャッシュに保存します。 34 // 次回同じ条件で呼び出されたときに、このキャッシュが使用されます。 35 $dnsCache[$cacheKey] = $result; 36 37 return $result; 38} 39 40// --- 以下はサンプルコードの実行例です --- 41 42echo "--- 1回目のチェック (Google.com の A レコード) ---\n"; 43// 初めての問い合わせなので、実際にDNSサーバーに問い合わせが行われます。 44$existsGoogleA1 = checkDnsRecordWithCache('google.com', 'A'); 45echo "Google.com (Aレコード) は存在しますか? " . ($existsGoogleA1 ? 'はい' : 'いいえ') . "\n\n"; 46 47echo "--- 2回目のチェック (Google.com の A レコード) ---\n"; 48// 同じホスト名とタイプなので、1回目の結果がキャッシュから返されます。 49// DEBUGメッセージで「キャッシュから取得しました」と表示されるはずです。 50$existsGoogleA2 = checkDnsRecordWithCache('google.com', 'A'); 51echo "Google.com (Aレコード) は存在しますか? " . ($existsGoogleA2 ? 'はい' : 'いいえ') . "\n\n"; 52 53echo "--- 3回目のチェック (Google.com の MX レコード) ---\n"; 54// ホスト名は同じですが、タイプが異なるため、新たにDNSサーバーに問い合わせが行われます。 55$existsGoogleMX = checkDnsRecordWithCache('google.com', 'MX'); 56echo "Google.com (MXレコード) は存在しますか? " . ($existsGoogleMX ? 'はい' : 'いいえ') . "\n\n"; 57 58echo "--- 存在しないドメインのチェック ---\n"; 59// 存在しないドメインの問い合わせ。結果は false で、これもキャッシュされます。 60$existsNonExistent = checkDnsRecordWithCache('nonexistent-domain-example-123.com'); // デフォルトはMX 61echo "nonexistent-domain-example-123.com (MXレコード) は存在しますか? " . ($existsNonExistent ? 'はい' : 'いいえ') . "\n\n"; 62 63echo "--- 2回目の存在しないドメインのチェック ---\n"; 64// キャッシュから結果が返されます。 65$existsNonExistent2 = checkDnsRecordWithCache('nonexistent-domain-example-123.com'); // デフォルトはMX 66echo "nonexistent-domain-example-123.com (MXレコード) は存在しますか? " . ($existsNonExistent2 ? 'はい' : 'いいえ') . "\n\n";
PHPのdns_check_record関数は、指定されたホスト名(ドメイン名など)に対して、特定のDNSレコードタイプが存在するかどうかを確認するために利用されます。この関数は、チェック対象のホスト名と、'A'(IPアドレス)、'MX'(メールサーバー)、'NS'(ネームサーバー)などのレコードタイプを引数に受け取ります。そして、指定されたレコードが存在すればtrueを、存在しなければfalseをブール値で返します。
提供されたサンプルコードでは、このdns_check_record関数を直接使うのではなく、checkDnsRecordWithCacheという独自の関数を定義し、問い合わせ結果を効率的に再利用する工夫がされています。この関数は、PHPのstatic変数を利用して、一度確認したDNSレコードの存在チェック結果をスクリプトの実行中に一時的に保存(キャッシュ)します。
これにより、同じホスト名とレコードタイプで再度チェックを行う場合、外部のDNSサーバーに繰り返し問い合わせることなく、キャッシュされた結果をすぐに返すことが可能になります。これは、外部へのネットワーク通信回数を削減し、プログラムの処理速度(パフォーマンス)を向上させる効果があります。このスクリプト内でのキャッシュは、実行が終了すると自動的にクリアされるため、次回のスクリプト実行には影響しません。このように、dns_check_record関数とキャッシュの仕組みを組み合わせることで、効率的かつ高速なDNSレコードチェック処理を実現できます。
dns_check_record関数は外部DNSサーバーへ問い合わせるため、頻繁な呼び出しはパフォーマンスに影響する場合があります。このサンプルコードのキャッシュはstatic変数を利用しており、現在のPHPスクリプト実行中のみ有効です。Webアプリケーションでは、HTTPリクエストごとにキャッシュがリセットされるため、リクエストをまたいだ利用には適していません。また、DNSレコードは時間とともに変化するため、キャッシュされた情報が常に最新とは限らない点も留意が必要です。