2009-09-02 37 views

Trả lời

15

có thể được thực hiện với curl, với lợi thế là không có lưu lượng mạng khác ngoài yêu cầu/phản hồi cuộn tròn. Yêu cầu DNS được thực hiện bằng cách cuộn tròn để lấy địa chỉ ip, có thể tìm thấy trong báo cáo chi tiết. Vì vậy:

  • Bật CURLOPT_VERBOSE.
  • CURLOPT_STDERR trực tiếp vào một tài nguyên trình bao bọc luồng "php: // temp".
  • Sử dụng preg_match_all(), phân tích cú pháp nội dung chuỗi của tài nguyên cho địa chỉ ip .
  • Địa chỉ máy chủ phản hồi sẽ nằm trong ô con sốcủa mảng đối sánh.
  • Địa chỉ của máy chủ phân phối nội dung (giả định yêu cầu thành công ) có thể được truy lục với kết thúc(). Bất kỳ địa chỉ nào trong số các địa chỉ của máy chủ cũng sẽ ở trong số phần phụ, theo thứ tự.

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

AFAIK bạn không thể 'buộc' máy chủ gửi cho bạn địa chỉ IP của mình trong phản hồi. Tại sao không tìm kiếm trực tiếp? (Kiểm tra this question/answers for how to do that from php)

+0

máy chủ bao gồm nhiều phiên bản đang chạy, vì vậy tôi cần tìm ra chính xác máy chủ nào tôi đã kết nối và trả lời cho một yêu cầu CURL cụ thể. – Beier

3

Tôi không nghĩ rằng có cách để lấy địa chỉ IP đó trực tiếp từ curl.
Nhưng một cái gì đó như thế này có thể làm các trick:

Thứ nhất, làm theo yêu cầu curl, và sử dụng curl_getinfo để có được những "thực" URL đã được lấy - điều này là vì URL đầu tiên có thể chuyển hướng với nhau, và bạn muốn trận chung kết một:

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

Sau đó, sử parse_url để trích xuất các "host" một phần từ URL đó cuối cùng:

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

và, cuối cùng, sử dụng gethostbyname t o có được địa chỉ IP tương ứng với chủ nhà rằng:

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

Vâng ...
Đó là một giải pháp ^^ Nó sẽ làm việc trong hầu hết các trường hợp, tôi cho rằng - mặc dù tôi không chắc chắn bạn sẽ luôn có được kết quả "chính xác" nếu có một số loại mecanism cân bằng tải ...

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

Điều đó sẽ cung cấp cho bạn tất cả địa chỉ IP được liên kết với tên máy chủ đã cho.

-1

Tôi sử dụng này một

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

từ đây: http://php.net/manual/en/function.gethostbynamel.php

3

Tôi nghĩ rằng bạn sẽ có thể để có được địa chỉ IP từ máy chủ với:

$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 
Các vấn đề liên quan