2009-09-02 27 views

答えて

15

このとする必要があります。カール要求/応答以外のネットワークトラフィックがないという利点があります。 DNS要求はcurlによってIPアドレスを取得するために作成されます。これは冗長なレポートにあります。したがって:

  • CURLOPT_VERBOSEをオンにします。
  • 直接CURLOPT_STDERRから 「php:// temp」ストリームラッパーリソース。
  • preg_match_all()を使用して、 アドレスのリソースの文字列コンテンツを解析します( )。
  • 応答するサーバーのアドレスは で、一致する配列のゼロキー サブアレイになります。
  • (成功 要求を仮定) コンテンツを配信するサーバのアドレスが 端()で取得することができます。間に入るサーバのアドレス も、サブアレイ に順番に格納されます。

デモ:

$url = 'http://google.com'; 
$wrapper = fopen('php://temp', 'r+'); 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_VERBOSE, true); 
curl_setopt($ch, CURLOPT_STDERR, $wrapper); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$result = curl_exec($ch); 
curl_close($ch); 
$ips = get_curl_remote_ips($wrapper); 
fclose($wrapper); 

echo end($ips); // 208.69.36.231 

function get_curl_remote_ips($fp) 
{ 
    rewind($fp); 
    $str = fread($fp, 8192); 
    $regex = '/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/'; 
    if (preg_match_all($regex, $str, $matches)) { 
     return array_unique($matches[0]); // Array([0] => 74.125.45.100 [2] => 208.69.36.231) 
    } else { 
     return false; 
    } 
} 
0

AFAIKでは、サーバーが応答で自分のIPアドレスを送信するよう強制することはできません。直接見上げてみませんか? (チェックthis question/answers for how to do that from php

+0

サーバーは複数の実行インスタンスで構成されているため、特定のCURLリクエストに接続して応答したサーバーを正確に把握する必要があります。 – Beier

3

カールから直接IPアドレスを取得する方法はないと思います。
しかし、このようなものは、トリックを行うことができます:

まず、カール要求を行うと、フェッチされた「本当の」URLを取得するためにcurl_getinfoを使用 - これは最初のURLを別のものにリダイレクトすることができますされているために、あなたは、最終的なものをしたい。そして、

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://www.google.com/"); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$content = curl_exec($ch); 
$real_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); 
curl_close($ch); 
var_dump($real_url); // http://www.google.fr/ 

、その最後のURLから「ホスト」の部分を抽出するためにparse_urlを使用します。

$host = parse_url($real_url, PHP_URL_HOST); 
var_dump($host);  // www.google.fr 

そして、最後に、gethostbynameトンを使用しますOそのホストに対応したIPアドレスを取得:

$ip = gethostbyname($host); 
var_dump($ip);   // 209.85.227.99 

うーん... それはほとんどのケースで動作するはずです^^ソリューションです
は、私は考えます - 私はわからないけれども、あなたがいつもなるだろうあなたに与えられたホスト名に関連付けられているすべてのIPアドレスを与えること

3
echo '<pre>'; 
print_r(gethostbynamel($host)); 
echo '</pre>'; 

...ロードバランシングmecanismのいくつかの種類がある場合に生じる「修正」。

-1

私はここからこの1

<? 
$hosts = gethostbynamel($hostname); 
if (is_array($hosts)) { 
    echo "Host ".$hostname." resolves to:<br><br>"; 
    foreach ($hosts as $ip) { 
      echo "IP: ".$ip."<br>"; 
    } 
} else { 
    echo "Host ".$hostname." is not tied to any IP."; 
} 
?> 

を使用:http://php.net/manual/en/function.gethostbynamel.php

3

私はあなたと、サーバからIPアドレスを取得することができるはずだと思います。

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://stackoverflow.com"); 
curl_exec($ch); 
$ip = curl_getinfo($ch,CURLINFO_PRIMARY_IP); 
curl_close($ch); 
echo $ip; // 151.101.129.69 
関連する問題