Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】CURLOPT_DNS_SERVERS定数の使い方

CURLOPT_DNS_SERVERS定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

CURLOPT_DNS_SERVERS定数は、PHPのcURL拡張機能において、ネットワーク通信でドメイン名からIPアドレスへの変換(名前解決)を行う際に使用するDNS(Domain Name System)サーバーのアドレスを指定するための定数です。この定数は、curl_setopt()関数に渡すオプションの一つとして利用されます。

ウェブサイトのドメイン名(例: example.com)は、コンピュータが直接通信できるIPアドレス(例: 192.0.2.1)に変換される必要があります。通常、この変換処理には、オペレーティングシステムがデフォルトで設定しているDNSサーバーが利用されます。しかし、開発者やシステム管理者が、特定のHTTPリクエストに対して、システム既定のDNSサーバーではなく、特定のDNSサーバーを使って名前解決を行いたい場合に、この定数が役立ちます。例えば、特定のネットワーク環境での名前解決を強制したい場合や、パフォーマンスのために特定のDNSキャッシュを利用したい場合などに使用されます。

この定数を利用する際は、オプションの値として、使用したい一つまたは複数のDNSサーバーのIPアドレスを文字列で指定します。複数のアドレスを指定する場合は、カンマやスペースで区切って記述できます。IPv6アドレスを指定する際には、[::1]のように角括弧で囲む形式が求められます。また、必要に応じてポート番号を指定することも可能です。

CURLOPT_DNS_SERVERSを適切に設定することで、cURLが行うネットワーク通信における名前解決の挙動を、より柔軟かつ詳細に制御できるようになります。これにより、特定の要件に基づいた通信の実現や、問題発生時のトラブルシューティングに役立つことが期待されます。不適切な設定は、意図しない通信エラーを引き起こす可能性もあるため、設定には注意が必要です。

構文(syntax)

1<?php
2$ch = curl_init();
3curl_setopt($ch, CURLOPT_DNS_SERVERS, ["192.168.1.1:53", "8.8.8.8"]);
4curl_close($ch);
5?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

CURLOPT_DNS_SERVERS は、DNSリゾルバとして使用するサーバーのIPアドレスを指定するための定数です。この定数は、curl_setopt() 関数と共に使用され、DNSサーバーのリストを文字列として設定します。

サンプルコード

PHP cURL: カスタムDNSサーバーで通信する

1<?php
2
3/**
4 * カスタムDNSサーバーを使用してHTTPリクエストを実行する関数。
5 *
6 * この関数は、指定されたURLに対してcURLリクエストを送信する際に、
7 * システムデフォルトのDNSサーバーではなく、指定されたカスタムDNSサーバーを使用します。
8 * また、DNSキャッシュのグローバル使用設定も行います。
9 *
10 * @param string $url リクエストを送信するURL。
11 * @param array $dnsServers 使用するDNSサーバーのIPアドレスの配列(例: ['8.8.8.8', '8.8.4.4'])。
12 * @return string|false リクエストのレスポンスボディ、またはエラー時にはfalse。
13 */
14function fetchDataWithCustomDns(string $url, array $dnsServers): string|false
15{
16    echo "--- cURLリクエスト処理開始 ---\n";
17
18    // 1. cURLセッションを初期化します。
19    // cURLは様々なプロトコル(HTTP, FTPなど)でデータ転送を行うためのライブラリです。
20    $ch = curl_init();
21
22    if ($ch === false) {
23        echo "エラー: cURLセッションの初期化に失敗しました。\n";
24        return false;
25    }
26
27    // 2. リクエストを送信するURLを設定します。
28    curl_setopt($ch, CURLOPT_URL, $url);
29    echo "リクエストURL: " . $url . "\n";
30
31    // 3. cURL_exec()が成功した場合に、取得したデータを直接出力せず、文字列として返却するように設定します。
32    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
33
34    // 4. カスタムDNSサーバーを設定します。
35    // CURLOPT_DNS_SERVERS は、DNSルックアップに使用するカスタムDNSサーバーを指定します。
36    // 値は、カンマで区切られたIPアドレスの文字列として渡す必要があります。
37    if (!empty($dnsServers)) {
38        $dnsServersString = implode(',', $dnsServers);
39        curl_setopt($ch, CURLOPT_DNS_SERVERS, $dnsServersString);
40        echo "カスタムDNSサーバーを「" . $dnsServersString . "」に設定しました。\n";
41    } else {
42        echo "カスタムDNSサーバーは指定されていません。システムのDNSサーバーが使用されます。\n";
43    }
44
45    // 5. DNSキャッシュをグローバルに共有するかどうかを設定します。
46    // CURLOPT_DNS_USE_GLOBAL_CACHE は、cURLがDNSキャッシュを複数のcURLハンドルで共有するか (true)、
47    // またはセッションごとに独立させるか (false) を制御します。
48    // 通常はtrue(デフォルト値)で問題ありません。
49    curl_setopt($ch, CURLOPT_DNS_USE_GLOBAL_CACHE, true);
50    echo "DNSグローバルキャッシュは有効に設定されています。\n";
51
52    // 6. 設定した内容でHTTPリクエストを実行し、レスポンスを取得します。
53    echo "HTTPリクエストを実行中...\n";
54    $response = curl_exec($ch);
55
56    // 7. cURLリクエストの実行中にエラーが発生したかを確認します。
57    if (curl_errno($ch)) {
58        echo 'エラー: cURLリクエスト失敗 - ' . curl_error($ch) . "\n";
59        $response = false;
60    } else {
61        echo "cURLリクエストが成功しました。\n";
62    }
63
64    // 8. cURLセッションを終了し、関連するリソースを解放します。
65    curl_close($ch);
66    echo "--- cURLリクエスト処理終了 ---\n";
67
68    return $response;
69}
70
71// === 関数使用例 ===
72echo "システムエンジニアを目指す初心者向け: PHP cURL拡張機能のDNS設定例\n";
73echo "===================================================================\n\n";
74
75// リクエストを送信するターゲットURLを定義します。
76$targetUrl = 'http://example.com'; 
77
78// 使用したいカスタムDNSサーバーのIPアドレスを配列で指定します。
79// ここでは、Google Public DNSのIPアドレスを例として使用しています。
80// 環境によっては、ローカルネットワーク内のDNSサーバーや特定のサービスプロバイダのDNSなどを指定できます。
81$customDnsServers = ['8.8.8.8', '8.8.4.4']; 
82
83// 上記で定義したカスタムDNSサーバーを使って、URLからデータを取得します。
84$data = fetchDataWithCustomDns($targetUrl, $customDnsServers);
85
86if ($data !== false) {
87    echo "\nデータ取得成功! レスポンスの一部を表示します。\n";
88    echo "---------------------------------------------------\n";
89    // 取得したデータはHTMLコンテンツなど非常に長い場合があるので、
90    // ここでは最初の500文字のみ表示しています。
91    echo substr($data, 0, 500) . "...\n";
92    echo "---------------------------------------------------\n";
93} else {
94    echo "\nデータの取得に失敗しました。上記のエラーメッセージを確認してください。\n";
95}
96

このPHPサンプルコードは、cURLライブラリを用いてHTTPリクエストを実行する際に、システムデフォルトのDNSサーバーではなく、指定したカスタムDNSサーバーを使用する方法を示しています。fetchDataWithCustomDns関数は、リクエストを送信する$urlと、使用するDNSサーバーのIPアドレスを格納した$dnsServers配列を引数に取ります。

コードの中心となるCURLOPT_DNS_SERVERS定数は、curl_setopt関数と組み合わせて使用され、DNSルックアップに使用するカスタムDNSサーバーのIPアドレスをカンマ区切りの文字列として設定します。これにより、特定のネットワーク環境やセキュリティポリシーに応じて、名前解決の経路を制御することが可能になります。また、CURLOPT_DNS_USE_GLOBAL_CACHE定数も設定されており、cURLがDNSキャッシュを複数のリクエスト間で共有するかどうかを制御します。

関数内では、まずcurl_initでcURLセッションを初期化し、CURLOPT_URLでターゲットURL、CURLOPT_RETURNTRANSFERでレスポンスを文字列として取得する設定を行います。その後、引数で渡された$dnsServersが空でなければCURLOPT_DNS_SERVERSに設定し、CURLOPT_DNS_USE_GLOBAL_CACHEを有効に設定します。設定が完了したらcurl_execでHTTPリクエストを実行し、成功した場合はレスポンスボディを文字列として、エラーが発生した場合はfalseを戻り値として返します。最後にcurl_closeでセッションを終了し、リソースを解放します。

サンプルコードでは、CURLOPT_DNS_SERVERSオプションに複数のDNSサーバーを指定する際、IPアドレスを「カンマ区切りの単一文字列」として渡す必要があります。配列のまま渡すとエラーになるため、implode()関数で正しく結合している点にご注目ください。

設定するDNSサーバーのIPアドレスは、ご利用のネットワーク環境で有効かつ適切なものを指定することが重要です。無効なDNSサーバーを指定すると、ウェブサイトの名前解決ができず、リクエストが失敗する原因となります。

また、CURLOPT_DNS_USE_GLOBAL_CACHEオプションは、DNSキャッシュを複数のcURLハンドルで共有するかどうかを設定します。パフォーマンス向上のため、通常はデフォルト値であるtrueのままで問題ありませんが、キャッシュを使わず常に新しい名前解決を行いたい場合はfalseに設定することも可能です。

cURLセッションの初期化失敗やリクエスト実行時のエラーは、curl_init()curl_errno()で必ず確認し、適切にエラーハンドリングを行うことで、プログラムの安定性が向上します。これらのエラーチェックは、実際のシステム開発において非常に重要です。

cURLでカスタムDNSとローカルIPを指定する

1<?php
2
3/**
4 * 指定されたURLに対してカスタムDNSサーバーとローカルIPv4アドレスを使用してHTTPリクエストを送信します。
5 *
6 * この関数は、CURLOPT_DNS_SERVERS(特定のDNSサーバーを指定)と
7 * CURLOPT_DNS_LOCAL_IP4(DNSクエリの送信元ローカルIPを指定)の使用例を示します。
8 * システムエンジニアを目指す初心者が、cURLにおけるネットワーク設定のカスタマイズを理解するのに役立ちます。
9 *
10 * @param string $url            リクエストを送信するターゲットURL。
11 * @param string $dnsServers     名前解決に使用するDNSサーバーのIPアドレス(スペースまたはカンマ区切り)。例: "8.8.8.8 1.1.1.1"
12 * @param string $localDnsQueryIp DNSクエリを送信するローカルIPv4アドレス。例: "192.168.1.100"
13 * @return string|false          HTTPレスポンスの本文、またはcURLエラー発生時はfalse。
14 */
15function fetchUrlWithCustomDns(string $url, string $dnsServers, string $localDnsQueryIp)
16{
17    // cURLセッションを初期化します
18    $ch = curl_init();
19
20    if ($ch === false) {
21        echo "エラー: cURLセッションの初期化に失敗しました。\n";
22        return false;
23    }
24
25    // リクエスト先のURLを設定します
26    curl_setopt($ch, CURLOPT_URL, $url);
27
28    // レスポンスを文字列として取得するよう設定します(画面に直接出力しないため)
29    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
30
31    // --- ここが重要:リファレンス情報で指定されたCURLOPT_DNS_SERVERSの使用例 ---
32    // 名前解決に使用する特定のDNSサーバーのIPアドレスを設定します。
33    // これにより、システムのデフォルトDNS設定ではなく、指定したDNSサーバーが優先的に使用されます。
34    curl_setopt($ch, CURLOPT_DNS_SERVERS, $dnsServers);
35
36    // --- ここが重要:キーワードに関連するCURLOPT_DNS_LOCAL_IP4の使用例 ---
37    // DNSクエリを送信する際のローカルIPv4アドレスを指定します。
38    // 複数のネットワークインターフェースを持つサーバーで、特定のIPからDNSクエリを発行したい場合に有用です。
39    // 注意: ここで指定するIPアドレスは、実行環境のサーバーに実際に割り当てられている必要があります。
40    //       存在しないIPを指定すると、DNS解決に失敗する可能性があります。
41    curl_setopt($ch, CURLOPT_DNS_LOCAL_IP4, $localDnsQueryIp);
42
43    // HTTPリクエストを実行し、レスポンスを取得します
44    $response = curl_exec($ch);
45
46    // cURL実行中にエラーが発生したか確認します
47    if (curl_errno($ch)) {
48        $errorMessage = curl_error($ch);
49        $errorCode = curl_errno($ch);
50        echo "cURLエラーが発生しました ({$errorCode}): {$errorMessage}\n";
51        $response = false; // エラー時はfalseを返します
52    } else {
53        // リクエストが正常に完了した場合の情報を表示します
54        echo "--- cURLリクエスト詳細 ---\n";
55        echo "ターゲットURL: {$url}\n";
56        echo "使用したDNSサーバー: {$dnsServers}\n";
57        echo "DNSクエリ送信元ローカルIPv4: {$localDnsQueryIp}\n";
58        echo "HTTPステータスコード: " . curl_getinfo($ch, CURLINFO_HTTP_CODE) . "\n";
59        echo "取得したレスポンスの一部:\n" . substr($response, 0, 200) . "...\n"; // レスポンスの先頭200文字を表示
60        echo "--------------------------\n";
61    }
62
63    // cURLセッションを閉じ、リソースを解放します
64    curl_close($ch);
65
66    return $response;
67}
68
69// --- サンプル実行部分 ---
70// 以下の値を環境に合わせて設定し、このコードを実行して動作を確認してください。
71
72// アクセスしたいURL
73$targetUrl = "https://www.example.com";
74
75// 使用したいDNSサーバーのIPアドレス(例: Google Public DNS と Cloudflare DNS)
76// 存在しないIPを指定すると、DNS解決に失敗し、cURLエラーが発生する可能性があります。
77$customDnsServers = "8.8.8.8 1.1.1.1";
78
79// DNSクエリを送信するローカルIPv4アドレス。
80// 【重要】ご自身のPCやサーバーに実際に割り当てられているIPv4アドレスを指定してください。
81// 例: "192.168.1.10", "10.0.0.5" など。
82// 環境に依存するため、この例ではテスト用途で利用可能なループバックアドレス "127.0.0.1" を指定しています。
83// 外部のDNSサーバーにアクセスし、その機能を確認する場合は、ネットワークインターフェースに割り当てられた実際のIPが必要です。
84$localDnsQueryIp = "127.0.0.1";
85
86
87echo "--- カスタムDNS設定でのcURLリクエストを開始します ---\n";
88$result = fetchUrlWithCustomDns($targetUrl, $customDnsServers, $localDnsQueryIp);
89
90if ($result !== false) {
91    echo "\n--> cURLリクエストは正常に完了しました。\n";
92} else {
93    echo "\n--> cURLリクエスト中にエラーが発生しました。\n";
94}
95
96// 注意: 環境によってはcURL拡張機能が有効になっていない場合があります。
97// その場合は、php.iniファイルで 'extension=curl' のコメントを解除し、Webサーバーを再起動してください。
98

このサンプルコードは、PHPのcURL拡張機能を利用してHTTPリクエストを送信する際、DNS(名前解決)の動作を詳細に制御する方法を、システムエンジニアを目指す初心者向けに示しています。特に、CURLOPT_DNS_SERVERSCURLOPT_DNS_LOCAL_IP4という二つの重要なオプションの使い方を解説します。

CURLOPT_DNS_SERVERSは、cURLがWebサイトの名前解決を行う際に、システムのデフォルト設定ではなく、開発者が指定したIPアドレスを持つDNSサーバーを使用するように設定する定数です。これにより、特定のDNSサーバーの利用を強制したり、ネットワーク設定に依存しない名前解決を試みたりする場面で役立ちます。この定数自体には引数はなく、curl_setopt関数を通じて、使用したいDNSサーバーのIPアドレスリストを文字列として指定します。戻り値は、内部的なオプション識別子を示す整数値です。

関連するCURLOPT_DNS_LOCAL_IP4は、DNSクエリを送信する際の「出発点」となるローカルのIPv4アドレスを指定するオプションです。複数のネットワークインターフェースを持つサーバーで、特定のIPアドレスからDNSクエリを発行したい場合に有用です。ただし、ここで指定するIPアドレスは、実行環境のサーバーに実際に割り当てられているものである必要があります。

コードでは、curl_initでcURLセッションを開始し、CURLOPT_URLでターゲットURLを設定した後、これら二つのオプションを使ってDNS設定をカスタマイズします。最終的にcurl_execでリクエストを実行し、curl_closeでセッションを閉じます。エラーハンドリングも含まれており、成功時にはレスポンスの一部と設定情報が表示され、cURLでのネットワーク制御の理解を深めることができます。

指定するDNSサーバーのIPアドレスと、ローカルIPv4アドレスは、実際に利用可能かつ実行環境に存在するものを設定してください。これらが正しくないと、名前解決やネットワーク接続が失敗する原因となります。特にCURLOPT_DNS_LOCAL_IP4で指定するIPアドレスは、サーバーのネットワークインターフェースに割り当てられている必要があります。本コードはPHPのcURL拡張機能を使用するため、実行前にphp.iniでextension=curlが有効になっているか確認してください。cURL通信はネットワーク状況に依存しエラーが発生しやすいため、curl_errnocurl_errorでのエラーチェックは必ず行ってください。これにより、問題発生時に原因を特定しやすくなります。

関連コンテンツ

関連IT用語

関連プログラミング言語