質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.22%

PHPにてPing送信による死活監視

解決済

回答 6

投稿

  • 評価
  • クリップ 0
  • VIEW 2,915

KK-31

score 17

前提・実現したいこと

PHPにてクライアントPCなどへのPing送信による死活監視。

該当のソースコード

function ping($host)
{
  $r = exec(sprintf('ping -c 1 -W 5 %s', escapeshellarg($host)), $res, $rval);
  return $rval === 0;
}


このコードを実行したところ、Shellからは問題なく、1か0の死活監視が出来ます。
ですが、Apache上で動かし、クライアントのブラウザから実行すると、execを使っているので、
動きません。
また、似たような情報として、

function ping($host,$port=80,$timeout=6)
{
  $fsock = fsockopen($host, $port, $errno, $errstr, $timeout);
  if ( ! $fsock ) {
    return False;
  } else{
    return True;
  }
}


このように、

fsockopen($host, $port, $errno, $errstr, $timeout)


を使う方法があるようですが、port番号を指定しているため、ポートを空けたサーバーなどしか
監視できないようです。
portを開放していないクライアントPCの場合は使えません。

この場合は、ブラウザからexecを実行させる許可等が出来るのか、
それとも他に何か方法があるのか、教えてください。
出来ない場合はJavaScriptなどの別言語で対応しようかと思っています。

ご教授宜しくお願い致します。

補足情報(言語/FW/ツール等のバージョンなど)

言語・バージョン:PHP / 5.4.16
サーバー:CentOS
WEB:Apache

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

+3

system( "ping xxx.xxx.xxx.xxx", $return_code );


ではいかがでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/16 16:59

    ありがとうございました。
    参考になりました。

    キャンセル

checkベストアンサー

+1

既にs.t.様の回答がありますので余分な事かもしれませんが、ブラウザからでもexecは動かせますよ。
s.t.様のsystem関数は出力の表示までやってくれるもので、execは実行(出力)のみを行うものです。
PHP execマニュアル
PHP systemマニュアル

コマンドでping結果をそのままファイル出力させてみてはいかがでしょう?
実際にコマンドが実行できているかという事と、処理結果が分かって効率的だと思います。

また、curlが使えるのであればそちらでも同じことはできます。
PHP curl

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/16 16:59

    ありがとうございました。

    キャンセル

+1

phpのマニュアルにsocket通信でICMPプロトコルを使用したPINGのコードが記載されています。

http://php.net/manual/ja/function.socket-create.php#Vu60438
http://php.net/manual/ja/function.socket-create.php#101012

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/16 17:01

    ありがとうございます。
    参考になりました。

    キャンセル

0

$array1 = exec('traceroute xxx.xxx.xxx.xxx', $array1);


として、最終配列行に呼び出したIPアドレスが存在するかを判断する方法を取りました。
ゲートウェイなどのネットワーク機器は判断のつけようが無いですが・・・
とりあえず、疎通確認ということで、これで行こうと思います。

より良い方法があれば教えてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

Windows+Apacheで下記のコードを動かしてみました。(Webページから処理を実行)この環境では問題なく、pingが動いています。
もしかしたら、Apacheのerror.logに何か権限関係のエラーが出ていないでしょうか?

$r = exec(sprintf(' "C:\Windows\System32\ping.exe" -n 1 -w 5 %s', $host), $res, $rval);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/16 16:59

    ありがとうございました。

    キャンセル

-1

ファイアウォールの絡みもあるのでWEBサーバーからpingを通せる範囲なんて
たかがしれているのでは?
ネットワーク管理アプリをいれないで確認が必要なサーバーは
cronで定期的にメールでも投げてもらってください

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/16 16:58

    クライアントのようなサーバーより優先度の低い機器のping監視を目的として質問に記載しています。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる