Serverのcron等からイベントを発生させクライアントにデータを送信したいのですが、どうするのがベターでしょうか?
onUpdate等で、sqlを毎回読んでいると sleep等をはさんでも負荷が心配です。
phpやシェルスクリプトで、websocketパケットを送信する方法がやはりよいのでしょうか?
簡単なサンプルもついてお返事いただけると嬉しいです。
Websocketは、基本的にクライアントからsocketサーバへコネクトしてから通信を始めるものなので、サーバからクライアントへデータを配信する用途には向きません。
たとえば定期的にサーバからWindowsクライアントへデータ配信したいなら、Windowsのタスクスケジューラにsocket通信を実行させるタスクを組み込んでやる必要があります。
負荷に関してはapache+php+MySQLなどを使ったWebサービスとさほど変わるものではなく、
負担がかかるとすればデータ通信量による負荷(通信帯域の限界)のほうが先にきます。
下記記事などを参考にされると良いでしょう。
さくらのVPSとPHPでWebSocketをサクっと勉強してみる
http://demouth.hatenablog.com/entry/20110111/1294699568
http://demouth.hatenablog.com/entry/20120102/1325516167
具体的な内容によりますが、全クライアント共通のデータならば、cronでイベントチェックしてデータを作成したら、それをキャッシュしておけば良いのでは?
具体的にはキャッシュ用のテーブル作って、更新時間とキャッシュデータからなるレコードを1レコードを収めておきます。
cron側ではそれを更新し、クライアント側は更新時間をみて前回から更新されているかチェックし、更新されていればキャッシュデータを読みます。
これをデータベースでやってもクエリは単純に1レコード読むだけで、なんら複雑なクエリではありません。クエリの間隔もcronでの更新を検知するためですから、数分から、短くとも数十秒単位でしょう。このクエリで負荷を問う様であれば、そもそもメインの処理を維持できるとは思えません。
それでも気になるという場合はmemcachedなどを検討してはどうでしょうか。
例えば、ちゃっと中に、何か有ったときつながってる相手にのみ送信の用な事がやりたいのです。DBに入っている値が変化した等。
2013/03/10 18:55:04変化したかどうかはcronを回せばいいのですが、そのcronからWebsocketをつかってどう送るべきなのか。。
回答したように、Websocketは、まず、クライアントからsocketサーバへコネクトする必要があります。
チャット中にクライアント側がコネクションを張ってくれればデータ送信は可能になりますが、サーバ側から強制的にデータを送る手段はありません。
PHPでWebSocketを使ったリアルタイムチャットを作る
http://blog.snowcait.info/2012/01/14/php%e3%81%a7websocket%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e3%83%aa%e3%82%a2%e3%83%ab%e3%82%bf%e3%82%a4%e3%83%a0%e3%83%81%e3%83%a3%e3%83%83%e3%83%88%e3%82%92%e4%bd%9c%e3%82%8b/#more-264
2013/03/10 21:35:27