2011-11-06 8 views
13

Tôi có chức năng sau đây mà tôi không làm việc cho đến nay. Tôi muốn ping một địa chỉ IP và sau đó để echo liệu IP có còn sống hay không.Ping một địa chỉ IP bằng cách sử dụng PHP và lặp lại kết quả

function pingAddress($ip){ 
    $pingresult = shell_exec("start /b ping $ip -n 1"); 
    $dead = "Request timed out."; 
    $deadoralive = strpos($dead, $pingresult); 

    if ($deadoralive == false){ 
     echo "The IP address, $ip, is dead"; 
    } else { 
     echo "The IP address, $ip, is alive"; 
    } 

} 

Khi tôi gọi hàm này sử dụng ví dụ:

pingAddress("127.0.0.1") 

Kết quả vang luôn là 'chết' - không có vấn đề gì.

Có thể ai đó vui lòng giúp tôi khi tôi gặp sự cố không? Và/HOẶC có cách nào tốt hơn để thực hiện việc này với cùng một kết quả không?

Rất cám ơn.

Cập nhật: Có mã sửa đổi để bao gồm dấu ngoặc kép nhưng vẫn nhận được kết quả tương tự (không chính xác).

+2

Bạn cần phải sử dụng dấu ngoặc kép cho cuộc gọi của bạn cho 'shell_exec' khác' $ ip' sẽ không được thay thế. – Clive

+0

Xin chào Clive, cảm ơn - tôi đã sử dụng dấu ngoặc kép ngay bây giờ nhưng vẫn nhận được kết quả tương tự. – Bernard

Trả lời

15

LƯU Ý: Giải pháp dưới đây không hoạt động trên Windows. Trên linux exec một lệnh "ping" từ giao diện điều khiển, và thiết lập đường dẫn lệnh (của cuộc gọi exec được đề xuất) cho phù hợp

Tôi nghĩ rằng bạn muốn kiểm tra trạng thái thoát của lệnh, trong khi shell_exec cung cấp cho bạn đầu ra đầy đủ (có thể nguy hiểm sẽ thay đổi đầu ra lệnh từ phiên bản lệnh sang phiên bản. vì một số lý do). Hơn nữa, biến $ ip của bạn không được diễn giải trong các dấu nháy đơn. Bạn sẽ phải sử dụng đôi "". Đó có thể là điều duy nhất bạn cần sửa để làm cho nó hoạt động.

Nhưng tôi cho rằng mã sau có thể "di động" hơn. IMHO thực tế là tốt hơn để nắm bắt trạng thái thoát, thay vì cố phân tích chuỗi kết quả. IMHO nó cũng tốt hơn để xác định đường dẫn đầy đủ để ping lệnh.

<?php 
function pingAddress($ip) { 
    $pingresult = exec("/bin/ping -n 3 $ip", $outcome, $status); 
    if (0 == $status) { 
     $status = "alive"; 
    } else { 
     $status = "dead"; 
    } 
    echo "The IP address, $ip, is ".$status; 
} 

pingAddress("127.0.0.1"); 
+0

HI maraspin, đã thử sử dụng chức năng này ở trên chính xác nhưng điều này sẽ nói thậm chí 999.999.999.999 vẫn còn sống khi tôi thử - có thể có bất cứ điều gì khác sai? Bạn có thể đề xuất bất kỳ mẹo khắc phục sự cố nào không? – Bernard

+4

** 1) ** 'ping', giống như hầu hết các tiện ích dòng lệnh UNIX, trả về 0 thành công, chứ không phải 1. ** 2) ** OP đang sử dụng Windows, vì vậy'/bin/ping' sẽ không hoạt động . – duskwuff

+1

xóa/bin/và thay đổi từ 0 đến 1 có vẻ đã hoạt động - cảm ơn tất cả. – Bernard

5

Điều này cũng không hiệu quả đối với tôi trong Wordpress. Tôi cũng đã thử -t và -n và những cách khác, nhưng không hoạt động. Tôi đã sử dụng,

function pingAddress($ip) { 
    $pingresult = exec("/bin/ping -c2 -w2 $ip", $outcome, $status); 
    if ($status==0) { 
    $status = "alive"; 
    } else { 
    $status = "dead"; 
    } 
    $message .= '<div id="dialog-block-left">'; 
    $message .= '<div id="ip-status">The IP address, '.$ip.', is '.$status.'</div><div style="clear:both"></div>';  
    return $message; 
} 
// Some IP Address 
pingAddress("192.168.1.1"); 

Điều này hoàn toàn phù hợp với tôi. tôi gọi này từ http://www.phpscriptsdaily.com/php/php-ping/ Hy vọng điều này sẽ giúp

Vâng, tôi muốn thay đổi điều này vì nó đang làm việc tốt trên localhost của tôi, nhưng không phải trên máy chủ trực tiếp của tôi Đối với máy chủ trực tiếp, tôi có một điều mà hiện đang làm việc cho cả hai địa phương cũng như sống.

$fp = fSockOpen($ip,80,$errno,$errstr,1); 
if($fp) { $status=0; fclose($fp); } else { $status=1; } 

Sau đó, tôi thấy các Server là cho 0 và xuống cho 1.

này hoạt động hoàn hảo cho tôi. Tôi nhận được điều này từ Ping site and return result in PHP Cảm ơn @ karim79

0

Điều này làm việc tốt với tên máy chủ, IP đảo ngược (cho mạng nội bộ) và IP.

function pingAddress($ip) { 
    $ping = exec("ping -n 2 $ip", $output, $status); 
    if (strpos($output[2], 'unreachable') !== FALSE) { 
     return '<span style="color:#f00;">OFFLINE</span>'; 
    } else { 
     return '<span style="color:green;">ONLINE</span>'; 
    } 
} 

echo pingAddress($ip); 
+0

Không bao giờ sử dụng đầu vào của người dùng trực tiếp trong 'exec'. Xem [câu hỏi này] (http://stackoverflow.com/q/982904/2008285) để biết cách chính xác để khử trùng dữ liệu đầu vào của người dùng. – Linek

+0

Yhe, đúng vậy. Trong mã của tôi, tôi có một hàm khử trùng khoảng $ _get, nhưng không phù hợp với câu hỏi này, vì vậy tôi đã xóa nó.Edit: Xóa tham số $ _get để xóa. – ChristianG

0

hoạt động tốt cho tôi ..

$host="127.0.0.1"; 
$output=shell_exec('ping -n 1 '.$host); 

echo "<pre>$output</pre>"; //for viewing the ping result, if not need it just remove it 

if (strpos($output, 'out') !== false) { 
    echo "Dead"; 
} 
    elseif(strpos($output, 'expired') !== false) 
{ 
    echo "Network Error"; 
} 
    elseif(strpos($output, 'data') !== false) 
{ 
    echo "Alive"; 
} 
else 
{ 
    echo "Unknown Error"; 
} 
1

Đối với Windows Sử dụng lớp này

$host = 'www.example.com'; 
$ping = new Ping($host); 
$latency = $ping->ping(); 
if ($latency !== false) { 
print 'Latency is ' . $latency . ' ms'; 
} 
else { 
print 'Host could not be reached.'; 
} 

https://github.com/geerlingguy/Ping

0

tôi sử dụng chức năng này:

<?php 
function is_ping_address($ip) { 
    exec('ping -c1 -w1 '.$ip, $outcome, $status); 
    preg_match('/([0-9]+)% packet loss/', $outcome[3], $arr); 
    return ($arr[1] == 100) ? false : true; 
} 
0

Đừng kiểm tra các trang man của lệnh ping trước khi thử một số trong những ví dụ ra (luôn luôn thực hành tốt anyway). Đối với Ubuntu 16 (ví dụ) câu trả lời được chấp nhận không hoạt động vì số -n 3 không thành công (đây không phải là số lượng gói tin nữa, -n biểu thị không chuyển đổi địa chỉ IP thành tên máy chủ).

Tiếp theo yêu cầu của OP, một chức năng tiềm năng thay thế sẽ là như sau:

function checkPing($ip){ 
    $ping = trim(`which ping`); 
    $ll = exec($ping . '-n -c2 ' . $ip, $output, $retVar); 
    if($retVar == 0){ 
     echo "The IP address, $ip, is alive"; 
     return true; 
    } else { 
     echo "The IP address, $ip, is dead"; 
     return false; 
    } 
}