PHP で ping を打つ

経緯

疎通確認のために ping を打ちたいと思いましたが、自PCがシャットダウンしているときも確認してほしいので Linux サーバ上で動作させたいと考えました。

今回は特にRedHat系のPHPサーバを前提として組んでみます。

なお、一度確認できれば良いのでコードは永続的な利用ではなく半分使い捨て、なのでセキュリティ等は考慮していないのでそのつもりで。

コード

<?php

/**
 * checkIpAddress IPアドレス形式チェック
 *
 * @param string $ip
 *
 * @return bool
 */
function checkIpAddress($ip)
{
    return preg_match(
        '/^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$/',
        $ip
    );
}

/**
 * sonaring pingを打つ
 *
 * @param string $host
 * @param string $filepath
 *
 * @return int|bool
 */
function sonaring($host, $filepath)
{
    $cmd = 'ping -i 3 ' . escapeshellarg($host) . ' | xargs -I_ date +\'%c _\' | tee ' . escapeshellarg($filepath);
        $r = exec(
            $cmd,
            $res,
            $rval
        );
}

/* main process */
$dateStr = date('Ymd');
sonaring('192.0.2.1', __DIR__ . DIRECTORY_SEPARATOR . 'result-' . '-' . $dateStr . '.log');

肝は exec() 関数で Linux のコマンドを直接叩いているところ。 PHP 単体で完結させたかったのですがそうも行かなさそうだったのでシンプルにこの方法を採りました。

チェックらしいチェックというと、最低限IPv4前提で正規表現でチェックをしているくらいですが。

とりあえずこれで目的は達成できたので良しとします。

参考

ping

tee

バックグラウンドプロセスの kill

PHP で ping

PHPその他

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。