PHP Curl, получение IP-адреса сервера

Я использую PHP CURL для отправки запроса на сервер. Что мне нужно сделать, чтобы ответ от сервера будет содержать IP-адрес этого сервера?

6 ответов


этой can сделайте с curl, с преимуществом не иметь никакой другой сетевой трафик кроме запроса/ответа curl. DNS-запросы выполняются curl для получения ip-адресов, которые можно найти в подробном отчете. Итак:

  • включите CURLOPT_VERBOSE.
  • прямой CURLOPT_STDERR к "php: / / temp " ресурс обертки потока.
  • используя preg_match_all () парсят содержимое строки ресурса для интеллектуальная собственность адрес(адреса).
  • адреса ответивших серверов будут быть в нулевом ключе массива match подмассив.
  • адрес сервера доставки содержание (при условии успешного запрос) можно получить с end (). Какого-либо вмешательства адреса серверов также будут в подмассива, в порядке.

демо:

$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;
    }
}

Я думаю, вы должны иметь возможность получить 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

Я не думаю, что есть способ получить этот IP-адрес непосредственно из curl.
но что-то вроде этого может сделать трюк :

во-первых, сделайте запрос curl и используйте curl_getinfo чтобы получить" реальный " URL, который был извлечен - это потому, что первый 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/

затем используйте parse_url чтобы извлечь часть "хост" из этого окончательного URL:

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

и, наконец, используйте gethostbyname чтобы получить IP-адрес, соответствующий этому хосту:

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

хорошо...
это решение ^^ оно должно работать в большинстве случаев, я полагаю , хотя я не уверен, что вы всегда получите "правильный" результат, если есть какой-то балансирующий нагрузку меканизм...


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

это даст вам все IP-адреса, связанные с данным именем хоста.


AFAIK вы не можете "заставить" сервер отправить вам свой IP-адрес в ответе. Почему бы не посмотреть прямо? (Проверка этот вопрос / ответы для того, как это сделать из php)


я использовал этот один

<?
$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