PHPでWebSocketサーバ実装 ※まだ途中

まだ納得のいく動きになってないのだけど、他にやらないといけないことができたので、
これまでのところをメモ的エントリ。


PHPによるWeb Socket実装「PHPWebSocket」
GitHub - GeorgeNava/phpwebsocket: PHP and WebSockets


PHPでWebSocketのサーバ実装ができるならステキじゃない?と思って手をつけてみますた。
詳しい説明は割愛、というかちゃんとできたらまた丁寧に書きます。


ここで提供されているサンプルは、ChatBotというか、なんしか入力された文字に応じて、
決められた返答を、入力した人に返すというただそれだけのもの。
それだと面白くないので、複数人が接続してチャットができるように改造しようとしてみた。
早い話がPHPWebSocketによるチャットアプリを作ってみようとした。


chatserver.php

#!/php -q
<?php  
// Run from command prompt > php -q chatserver.php
include "websocket.class.php";

// Extended basic WebSocket as ChatServer
class ChatServer extends WebSocket{
  function process($user,$msg){
    $this->say("< ".$msg);
    $this->broadcast($user->socket,$msg);
  }

  function broadcast($client,$msg){ 
    $msg = $this->wrap($msg);

    foreach($this->users as $user){
      if($user->socket!==$client){
        socket_write($user->socket,$msg,strlen($msg));
        $this->say("! ".strlen($msg));
      }
    }
  }
}

$master = new ChatServer("localhost",12345);

このchatserver.phpを実行して、複数ブラウザからアクセスしてみると
なぜかそれぞれのソケットリソースへの書込み(socket_writeの箇所)が最初だけうまくいかない。
二回目以降は正しく動く。図で言うと以下みたいな感じ。

左が書き込んだ「よほほい」(1)は右に表示されず、次に書き込んだ「むほほん」(2)は表示される。
Debugしてみたが、(1)も(2)も間違いなくsocket_writeの箇所は通っているし、エラーも吐いていない。
ブラウザ側の問題かもしれない・・・?
よくわかんないけど、また時間のある時に続きを調べます。


※動作環境
PHP 5.3.3
ブラウザ:Chrome 10.0