PHP socket_connect のタイムアウト

PHP でサーバーからクライアントへデータを通知するのにソケット通信を行う場合、クライアント側のアプリが接続可能状態でないとソケットの接続が長い時間戻って来なくなります。それを回避するには、socket_set_option でタイムアウト時間を設定します。

<?php
$address = "192.168.1.xxx";    // 送信先のIPアドレス
$port = xxxx;                  // 送信先のポート
$msg = "送信するメッセージです。";
$res = "";

$start = time();

// TCP/IP ソケット作成
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

if ($socket === false)
{
    $res = "socket_create() 失敗: ".socket_strerror(socket_last_error()).PHP_EOL;
}
else
{
    // 送信タイムアウト時間の設定(10秒)
    $timeout = array('sec' => 10, 'usec' => 0);
    socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeout);

    // ソケット接続
    $result = socket_connect($socket, $address, $port);

    if ($result === false)
    {
        $res = "socket_connect() 失敗: ".socket_strerror(socket_last_error($socket)).PHP_EOL;
    }
    else
    {
        $result = socket_write($socket, $msg, strlen($msg));
        if ($result === false)
        {
            $res = "socket_write() 失敗: ".socket_strerror(socket_last_error($socket)).PHP_EOL;
        }
        else
        {
            $res = "送信しました。".PHP_EOL;
        }
    }
    // ソケットを閉じる
    socket_close($socket);
}

$end = time();

echo $res;
echo ($end - $start)." 秒".PHP_EOL;
?>

BUFFALO スイッチング Hub LSW3-TX-8EP/BK

昨日の午前中に当サーバーへアクセスが出来なくなっていました。

昼休みに会社から自宅へ戻りしらべると、サーバーとLANに接続していたハブのパワーランプが消えていました。コンセントはちゃんと差してあるのに。昨晩からネットの調子が悪かったので何度かパワーON/OFFをしなければならなかったので、壊れかけていたかも。

取り急ぎ、ADSLモデムからサーバーへ直接LANケーブル差して午後から一時的に復旧。ご迷惑をおかけしました。

それで、新しく購入したハブが BUFFALO 10/100M対応 スイッチングHub ブラック LSW3-TX-8EP/BK

ちょっと見えているFONルータは無線LANアクセスポイント代わりに使っています。

BUFFALO 10/100M対応 スイッチングHub ブラック LSW3-TX-8EP/BK
BUFFALO 10/100M対応 スイッチングHub ブラック LSW3-TX-8EP/BK