- ベストアンサー
PHPでリアルタイムにデータを受け取る方法とは?
- PHPとMySQLを使ったウェブアプリケーション開発において、リアルタイムなデータ受け取りを実現する方法について調査中です。
- クライアントソフトが数分間に一回サーバーへ情報を取りに行く方法ではなく、負荷を軽減できる手法があるか検討しています。
- クライアントの発信元情報をサーバー側のデータベースに記録し、データベースの更新時に通知を行い、待機中のクライアントに一斉送信する方法が可能か調査しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
クライアントから定期的に取りに行かないとすると、やり方としては大きく2通り。 1.普段はTCPセッションを張って無くて、必要が生じたときにサーバーからクライアントにTCPセッションを張って通知する。 ⇒No1の方の回答の通り。イントラならあり得るでしょうね。ブラウザは不可。 2.常時TCPセッションを張っておいて、必要が生じたらサーバーからクライアントに通知する。 ⇒WebSocketというキーワードで調べてみてください。HTML5の機能の一つなのでブラウザによってはサポートしている。まだこなれていない技術なのでドキュメントも少ないと思います。 http://ja.wikipedia.org/wiki/WebSocket TCPセッションを常時張ったままなので、クライアントが多いとサーバーリソースが持たないかも 現状では、定期的にクライアントから取りに行くのがいいでしょうね。
その他の回答 (2)
- superside0
- ベストアンサー率64% (461/714)
HTTPはブラウザからのキックで通信が始めるのと、一往復で終わる、ステートレスな通信なので、 サーバーからのキックでセッションを開始するというのは、基本的には無理なんですが、 以前 AJAXタイプのチャットのプログラムを作った時に、以下の手法で ポーリング回数を減らしたり、リアルタイムに表示できることを、実現したことがあります。 ・ブラウザ側のjavascriptが、新規投稿がないかをサーバーに問い合わせしにいく。(投稿にIDを付けて、受け取れているIDを引き渡し) ・サーバ側では、新規投稿があればすぐにXMLでデータを返すが、 新規投稿がないときはゼロの返事をすぐに戻すのではなく、一旦保留する。 ・ブラウザにとっては、見かけ上 サーバーの応答が遅いだけに見えるので、返事がくるのを待っている。 ・サーバー側で 新規投稿があった時点で、すぐに保留を再開してブラウザにデータを返す。 (ブラウザ側では見かけ上、リアルタイムに新規投稿されたデータが表示されていく) ・HTTPのタイムアウト防止のため、新規投稿がなくてもある程度は、新規投稿ゼロを戻す。 ・ブラウザ側では、データを受取って表示したら、すぐに次のリクエストを送る。 ご参考まで。
- shimix
- ベストアンサー率54% (865/1590)
通知の必要が生じたときにphpスクリプトが起動される・・・ということですよね。 クライアント側は特定のポートで待ち受けていないといけませんから、ブラウザでは無理ですね。専用のWin32アプリを作成するにしても、Firewallで許可してもらう必要がありますし、ルータを使った環境であればポート開放が必要になります。 また、クライアントがその時点で待ち受けているかどうかの保証はありませんから(通信環境の都合でIPアドレスが変わっている可能性もある)相当に無駄が発生しそうです。 イントラ環境であれば、それなりに使えるような気はします。というか、それならそれでphpスクリプトでなくデータベースを更新したプロセスが通知すればいいように思います(Win32アプリ同士のやりとりで完結しそうな・・・)。
お礼
接続が多いとかえって負担がかかるとのことですので、クライアント側では素直にタイマーで定期取得させるようにさせたいと思います。