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の箇所は通っているし、エラーも吐いていない。
ブラウザ側の問題かもしれない・・・?
よくわかんないけど、また時間のある時に続きを調べます。