dポイントプレゼントキャンペーン実施中!

PHPとMySQLをつかったウェブアプリケーションの開発に関する情報を収集しています。

クライアントソフトが数分間に一回、サーバーへ情報を取りに行く方法ではなく、以下の方法ができたら負荷が少なくていいかなと考えています。このような手法は可能でしょうか。

・クライアントの発信元情報を、サーバー側のデータベースに記録しておく
・データベースが更新され、通知の必要が生じたら、先ほど記録されたクライアント情報の一覧を取得し、それらにデータを一斉送信
・待機中のクライアントがデータを受け取り、情報が表示される。

クライアント側はブラウザだけではなく、Win32アプリケーションなどAPIの選択肢が幅広いアプリケーションも使えるものとします。もし技術的に無理なようであれば、無難に定期的にデータを取得しに行く方法を採用したいと思います。

A 回答 (3件)

クライアントから定期的に取りに行かないとすると、やり方としては大きく2通り。



1.普段はTCPセッションを張って無くて、必要が生じたときにサーバーからクライアントにTCPセッションを張って通知する。
⇒No1の方の回答の通り。イントラならあり得るでしょうね。ブラウザは不可。

2.常時TCPセッションを張っておいて、必要が生じたらサーバーからクライアントに通知する。
⇒WebSocketというキーワードで調べてみてください。HTML5の機能の一つなのでブラウザによってはサポートしている。まだこなれていない技術なのでドキュメントも少ないと思います。
http://ja.wikipedia.org/wiki/WebSocket
 TCPセッションを常時張ったままなので、クライアントが多いとサーバーリソースが持たないかも

現状では、定期的にクライアントから取りに行くのがいいでしょうね。
    • good
    • 0
この回答へのお礼

接続が多いとかえって負担がかかるとのことですので、クライアント側では素直にタイマーで定期取得させるようにさせたいと思います。

お礼日時:2011/10/24 21:36

HTTPはブラウザからのキックで通信が始めるのと、一往復で終わる、ステートレスな通信なので、


サーバーからのキックでセッションを開始するというのは、基本的には無理なんですが、
以前 AJAXタイプのチャットのプログラムを作った時に、以下の手法で
ポーリング回数を減らしたり、リアルタイムに表示できることを、実現したことがあります。

・ブラウザ側のjavascriptが、新規投稿がないかをサーバーに問い合わせしにいく。(投稿にIDを付けて、受け取れているIDを引き渡し)
・サーバ側では、新規投稿があればすぐにXMLでデータを返すが、
 新規投稿がないときはゼロの返事をすぐに戻すのではなく、一旦保留する。
・ブラウザにとっては、見かけ上 サーバーの応答が遅いだけに見えるので、返事がくるのを待っている。
・サーバー側で 新規投稿があった時点で、すぐに保留を再開してブラウザにデータを返す。
 (ブラウザ側では見かけ上、リアルタイムに新規投稿されたデータが表示されていく)
・HTTPのタイムアウト防止のため、新規投稿がなくてもある程度は、新規投稿ゼロを戻す。
・ブラウザ側では、データを受取って表示したら、すぐに次のリクエストを送る。

ご参考まで。
    • good
    • 0

通知の必要が生じたときにphpスクリプトが起動される・・・ということですよね。



クライアント側は特定のポートで待ち受けていないといけませんから、ブラウザでは無理ですね。専用のWin32アプリを作成するにしても、Firewallで許可してもらう必要がありますし、ルータを使った環境であればポート開放が必要になります。

また、クライアントがその時点で待ち受けているかどうかの保証はありませんから(通信環境の都合でIPアドレスが変わっている可能性もある)相当に無駄が発生しそうです。

イントラ環境であれば、それなりに使えるような気はします。というか、それならそれでphpスクリプトでなくデータベースを更新したプロセスが通知すればいいように思います(Win32アプリ同士のやりとりで完結しそうな・・・)。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!