2011-08-12 18 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秒後自動爲該用戶發送操作。我會怎麼做呢?我嘗試過使用存儲在其中的time(),然後檢查數學運算的last_update,但是,只有在插槽發生更改時纔會運行我在while(true)循環內執行的任何操作,該更改來自用戶結束...

我想我只是超級失落。 :)

謝謝!

+0

什麼ü要我們回答?!?!? – kritya

+0

我認爲OP想知道如何去執行 –

回答

1

你需要爲你的socket_recv()函數設置一個非阻塞標誌。否則,它只會坐在這條線上,直到收到最小數量的字節。

也許

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

這個問題中列出的動作,所以我把那個標誌放在那裏,然後我可以在while(true)循環的末尾運行一個函數? – SocketN00b

+0

大問題......當我把MSG_DONTWAIT標誌放在那裏時,客戶端在連接後立即斷開......非常糟糕...... :) – SocketN00b

+0

仔細看看你的代碼。您正在檢查是否收到字節,然後您明確關閉連接。自從您使用非阻塞函數後,您顯然不會在每次迭代中獲取字節。 –