2011-11-06 69 views
13

我有以下功能,目前爲止我沒有工作。我想ping一個IP地址,然後回顯IP是否存活。使用PHP Ping IP地址並回顯結果

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

} 

當我打電話使用的例子此功能:

pingAddress("127.0.0.1") 

回聲結果總是「死」 - 不管是什麼。

有人可以幫我,我哪裏出錯了嗎? 和/或有沒有更好的方法來做到這一點的結果相同?

非常感謝。

更新:修改了代碼以包含雙引號,但仍得到相同(不正確)的結果。

+2

您需要使用雙引號爲您的來電'shell_exec'否則'$ ip'不會被取代。 – Clive

+0

嗨克萊夫,謝謝 - 我現在用雙引號,但仍然得到相同的結果。 – Bernard

回答

15

注意:以下解決方案在Windows上不起作用。在linux上,從控制檯執行「哪個ping」命令,並相應設置命令路徑(建議的exec調用)

我想你想檢查命令的退出狀態,而shell_exec會給你完整的輸出可能是危險的,因爲某種原因應該命令輸出從命令版本更改爲版本)。而且你的變量$ ip不能在單引號內解釋。你必須使用雙重「」。這可能是您需要修復才能使其工作的唯一一件事。

但我認爲下面的代碼可以更「便攜」。恕我直言,它實際上更好地趕上退出狀態,而不是試圖解析結果字符串。恕我直言,指定ping命令的完整路徑也更好。

<?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,已經嘗試過使用上面的這個函數,但是這會說甚至999.999.999.999在我嘗試時仍然存在 - 是否還有其他問題?你能提出任何疑難解答提示嗎? – Bernard

+4

** 1)與大多數UNIX命令行實用程序一樣,**'ping'在成功時返回0,而不是1. ** 2)** OP使用Windows,所以'/ bin/ping'將不起作用。 – duskwuff

+1

刪除/ bin /並將0更改爲1看起來工作 - 謝謝大家。 – Bernard

5

這在Wordpress中也不適用於我。我也嘗試了-t和-n等方式,但沒有奏效。我用過,

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"); 

這對我來說完全合適,最後。 我提到這個自http://www.phpscriptsdaily.com/php/php-ping/ 希望這將有助於

嗯,我想,因爲它工作正常在我的本地主機,但不是我的活的服務器 對於實時服務器上修改這個,我還有一件事現在該功能爲本地以及生活。

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

那麼我告訴服務器是彌補0和停機1.

這完全適用於我。我得到這從Ping site and return result in PHP謝謝@ karim79

0

這適用於主機名,反向IP(用於內部網絡)和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

永遠不要直接在'exec'中使用用戶輸入。請參閱[此問題](http://stackoverflow.com/q/982904/2008285)以獲取消毒用戶輸入數據的正確方法。 – Linek

+0

咦,真的。在我的代碼中,我有一個關於$ _get的sanitize函數,但有點與這個問題沒有關係,所以我刪除了它。編輯:刪除$ _get參數清除。 – ChristianG

0

這對我來說很好。

$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

對於Windows使用這個類

$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

我用這個函數:

<?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

不要嘗試其中的一些前檢查ping命令的手冊頁例子(反正總是很好的做法)。對於Ubuntu 16(例如),接受的答案不起作用,因爲-n 3失敗(這不再是數據包的計數,-n表示不將IP地址轉換爲主機名)。

繼OP的要求,一個潛在的替代功能將是如下:

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