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;
?>

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください