2011-08-12 9 views
0

私は、サーバー側でこのループを実行している:のWebSocket - PHPプッシュデータ

while (true) { 
    $changed = $this->sockets; 
    socket_select($changed, $write = NULL, $except = NULL, NULL); 
    foreach($changed AS $socket) { 
      if($socket == $this->master) { 
        $client = socket_accept($this->master); 
        if($client < 0) { 
          echo "socket_accept failed"; 
          continue; 
        } else { 
          $this->connect($client); 
        } 
      } else { 
        $bytes = @socket_recv($socket, $buffer, 2048, 0); 
        if($bytes == 0) { 
          $this->close($socket); 
        } else { 
          $user = $this->get_user_by_socket($socket); 
          if(!$user->handshake) { 
            $this->do_handshake($user, $buffer); 
          } else { 
            $this->process($user, $buffer); 
          } 
        } 
      } 
    } 
} 

何がすべてのクライアントに送信することができます任意のアクションを実行する前に、ソケット内で変更されるため、基本的には待機し、または単に個々のクライアント。私がやりたいことは、ある一定の時間が過ぎた後にデータをクライアントにプッシュできることです。ゲーム内のカウントダウンタイマーのように言えます。したがって、ユーザーからの操作がない場合は5秒後に自動的にそのユーザーの操作を送信します。それについてどうすればいいのですか?私はlast_updateをその中に保存してから数学をチェックしようとしましたが、while(true)ループ内に置かれたものは、ソケットに変更があった場合にのみ実行されます。最後...

私はちょうどスーパーロストだと思います。 :)

ありがとう!

+0

Uは、私たちが答えるために何をしたいですか?!?!? – kritya

+0

私はOPが知りたいと思っています、質問内に配置されたアクションを実行するにはどうすればいいですか? –

答えて

1

socket_recv()関数に非ブロッキングフラグを設定する必要があります。さもなければ最小バイト数が受け取られるまでちょうどこのラインの上に座るでしょう。

おそらく

$bytes = socket_recv($socket, $buffer, 2048, MSG_DONTWAIT); 
+0

Ok ...そこにそのフラグを投げて、while(true)ループの最後に関数を実行できます? – SocketN00b

+0

大きな問題...そこにMSG_DONTWAITフラグを投げると、クライアントは接続直後に切断されます...非常に悪い... :) – SocketN00b

+0

あなたのコードをよく見てください。受信したバイトがない場合は、接続を明示的にクローズします。ノンブロッキング関数を使用しているので、明らかに、すべての繰り返しでバイトを取得することはありません。 –

関連する問題