SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【php】curl関数でresolveオプションを指定して名前解決を操作する

問題

phpからテスト用のAPIなどにアクセスするときに、DNSでの名前解決を使わないで、こちらで指定したホスト名とIPを指定してアクセスすることはできないでしょうか。

答え

curlには –resolve という名前解決オプションがある。

phpのcurl関数はcurlコマンドのラッパー。

phpのcurl関数でも、オプションを指定して、curlコマンドの –resolveオプションと同じように、ホスト名とIPアドレスを指定してリクエストを送ることができる。

以下のように設定すれば、curl()通信時に、指定したホスト名のとき、DNSに問い合わせたりしないで、指定したIPアドレスにアクセスできる。

curl_setopt($ch, CURLOPT_RESOLVE, array('ホスト名:ポート番号:宛先のIPアドレス'));
curl_setopt($ch, CURLOPT_RESOLVE, array(
  'ホスト名:ポート番号:宛先のIPアドレス',
  'ホスト名:ポート番号:宛先のIPアドレス',
  'ホスト名:ポート番号:宛先のIPアドレス'
));

使用例

php

<?php

$data = [];

$ch = curl_init();
curl_setopt($ch, CURLOPT_RESOLVE, ['api.example.com:80:127.0.0.1']);
curl_setopt($ch, CURLOPT_PORT, 80);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_URL, 'http://api.example.com/api/test/123');
$response = curl_exec($ch);

var_dump($response);

実行結果

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
<hr>
<address>Apache/2.4.18 (Ubuntu) Server at api.example.com Port 80</address>
</body></html>

関連するメモ

コメント