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

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

Solutions Collecting From Web of "PHP Curl, получение IP-адреса сервера"

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

  • Включите CURLOPT_VERBOSE.
  • Прямой CURLOPT_STDERR к ресурсу оболочки потока php: // temp .
  • Используя preg_match_all () , проанализируйте содержимое строки ресурса для IP-адресов (адресов).
  • Адреса отвечающего сервера будут в подмассиве с нулевым ключом совпадения.
  • Адрес сервера, доставляющего контент (при условии успешного запроса), может быть восстановлен с помощью функции 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-адрес непосредственно из 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-адреса, связанные с данным именем узла.

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

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