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.";
}
?>