PHP Curl, almak Sunucu IP Adresi

5 Cevap php

Ben bir sunucuya bir istek göndermek için PHP CURL kullanıyorum. Ne sunucudan yanıt bu sunucunun IP adresini içerecek bunu yapmak gerekiyor?

5 Cevap

Bu can kıvırmak istek / yanıt dışında hiçbir ağ trafiğini sahip olmanın avantajı ile, kıvrılma ile yapılabilir. DNS istekleri ayrıntılı raporda bulunabilir ip adreslerini almak için curl tarafından yapılır. Yani:

  • CURLOPT_VERBOSE açın.
  • Direct CURLOPT_STDERR to a "php://temp" stream wrapper resource.
  • Using *preg_match_all()*, parse the resource's string content for the ip address(es).
  • The responding server addresses will be in the match array's zero-key subarray.
  • The address of the server delivering the content (assuming a successful request) can be retrieved with end(). Any intervening servers' addresses will also be in the subarray, in order.

Demo:

$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;
    }
}
echo '<pre>';
print_r(gethostbynamel($host));
echo '</pre>';

Bu size verilen konak adı ile ilgili tüm IP adreslerini verecektir.

AFAIK Eğer 'kuvvet' sunucuyu tepki size onun IP adresini göndermek için yapamam. Neden doğrudan onu aramak değil? (this question/answers for how to do that from php edin)

Ben bunu kullandı

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

Buradan: http://php.net/manual/en/function.gethostbynamel.php