21

今まで使っていない次の機能があります。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")

エコーの結果は常に「デッド」です-何があっても。

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

どうもありがとう。

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

4

9 に答える 9

18

注:以下の解決策はWindowsでは機能しません。Linux execでは、コンソールから「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");
于 2011-11-06T22:20:13.480 に答える
8

これも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で結果を返します。Thanks@ karim79

于 2012-05-11T12:16:22.850 に答える
5

私は、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";
于 2018-03-28T22:02:07.867 に答える
3

上記のすべての知識の獲得を組み合わせることにより、非常に高速なソリューションを作成しました

    function pinger($address){
        if(strtolower(PHP_OS)=='winnt'){
            $command = "ping -n 1 $address";
            exec($command, $output, $status);
        }else{
            $command = "ping -c 1 $address";
            exec($command, $output, $status);
        }
        if($status === 0){
            return true;
        }else{
            return false;
        }
    }
于 2019-06-20T12:45:17.250 に答える
2

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

$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";
}
于 2017-04-19T01:22:34.467 に答える
2

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

于 2017-06-16T11:09:12.307 に答える
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);
于 2017-03-22T12:03:45.510 に答える
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;
    }
}
于 2017-11-20T18:16:09.580 に答える
-1

私はこの関数を使用します:

<?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;
}
于 2017-09-19T08:18:22.240 に答える