Завихрение PHP, получая IP-адрес Сервера

Вы видите полный список здесь или можете найти Ваше устройство здесь

8
задан Jon Seigel 26 April 2010 в 11:36
поделиться

4 ответа

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

  • Включите CURLOPT_VERBOSE.
  • Направьте CURLOPT_STDERR на Ресурс оболочки потока " php: // temp ".
  • Используя preg_match_all () , проанализируйте строковое содержимое ресурса для IP адрес (а).
  • Адреса отвечающих серверов будут быть в нулевом ключе массива совпадений подмассив.
  • Адрес сервера, доставляющего содержание (при условии успешного запрос) можно получить с помощью конец () . Любое вмешательство адреса серверов также будут в подмассив, по порядку.

Демонстрация:

$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;
    }
}
19
ответ дан 3 November 2019 в 13:09
поделиться

Я не думаю, что есть способ получить этот 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 , чтобы извлечь часть «host» из этого конечного 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

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

3
ответ дан 3 November 2019 в 13:09
поделиться

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

0
ответ дан 3 November 2019 в 13:09
поделиться
echo '<pre>';
print_r(gethostbynamel($host));
echo '</pre>';

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

3
ответ дан 3 November 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: