web-dev-qa-db-ja.com

PHPを使用してIPアドレスをpingし、結果をエコーする

私は今のところ動作しない次の機能を持っています。 IPアドレスを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")

エコー結果は、常に「死んだ」ものです。

誰かが私が間違っているところを助けてくれますか?そして/または同じ結果でこれを行うより良い方法はありますか?

どうもありがとう。

更新:二重引用符を含めるようにコードを修正しましたが、それでも同じ(誤った)結果が得られます。

15
Bernard

注:以下の解決策はWindowsでは機能しません。Linuxでは、コンソールから「which 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");
15
maraspin

これも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サイトから取得し、PHPで結果を返します ありがとう@ karim79

6

これは私にとってはうまくいきます。

$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
Arif Yaacob

WindowsとLinuxの両方の異種OSで動作するアルゴリズムを開発しました。

次のクラスを実装します。

<?php

    class CheckDevice {

        public function myOS(){
            if (strtoupper(substr(PHP_OS, 0, 3)) === (chr(87).chr(73).chr(78)))
                return true;

            return false;
        }

        public function ping($ip_addr){
            if ($this->myOS()){
                if (!exec("ping -n 1 -w 1 ".$ip_addr." 2>NUL > NUL && (echo 0) || (echo 1)"))
                    return true;
            } else {
                if (!exec("ping -q -c1 ".$ip_addr." >/dev/null 2>&1 ; echo $?"))
                    return true;
            }

            return false;
        }
    }

    $ip_addr = "151.101.193.69"; #DNS: www.stackoverflow.com

    if ((new CheckDevice())->ping($ip_addr))
        echo "The device exists";
    else 
        echo "The device is not connected";
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
Kuldeep

これらの例を試す前に、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;
    }
}
0
bnoeafk