2

この問題は、しばらくの間、私にとって非常に頭の体操でした。私がかなり多く書いている場合はお詫びします。私がすでに試したことなどを明確にしたいだけです.

複雑さはあまり関係ないので、問題の考え方をできるだけ簡単に説明します。サイトには、一度に最大 80 ~ 90 人のユーザーがいる場合があります。それらはすべて、result.php と呼ぶ同じページにアクセスする可能性があります。ただし、ID の get 変数 (result.php?ID=456) を介して異なる結果にアクセスします。一度に 3 人または 4 人未満のユーザーが個々のレコードに存在する可能性が高く、10000 を超えるレコードがあります。

20 ~ 25 秒以内のエラー マージン (これは非常に重要です) で、そのページの特定の ID に誰がいるかを知り、それに応じてページを更新する必要があります。ページに表示されなくなったら、できるだけ早く名前を削除します。

現在、私はphpファイルを呼び出すjQueryスクリプトを使用しており、この特定のIDにアクセスしている「現在アクセス中」のユーザー名のデータベースから読み取り、アクセスした日付が過去25秒以内である場合にのみ. このファイルは、テーブルを整理するために、5 分以上経過したすべてのエントリも削除します。

これは 20 人または 30 人のユーザーでは問題ありませんでしたが、負荷が 2 倍以上になった今、これが特に遅い方法であることに気付きました。

他にどのような方法がありますか? 誰かが同様の状況で経験したことがありますか?

現在使用しているものはすべて PHP でコーディングされており、小さな jQuery が含まれています。問題があれば、ホスティング会社がオフサイトで管理するサーバーで実行しています。

私はコメットまたはコメット サーバーと呼ばれるものに出くわしました。

4

2 に答える 2

1

リアルタイムのソケット接続については、Websocketsを調べてください。Websockets を使用して、(ポーリングではなく) リアルタイムで更新をプッシュして、「現在オンラインのユーザー」の変更がミリ秒以内に送信されるようにすることができます。

于 2012-06-05T23:59:01.993 に答える
0

必要なのは、サイトでのアクティビティの状態を維持するサービス レイヤーを備えたメモリ内キャッシュです。memcachedを使用することは、良い出発点かもしれません。疑似コードは次のようになります。

  • ページ アクセスで、CurrentUserService を呼び出す
  • CurrentUserService は、アクセスしているページとユーザーをパラメーターとして受け取ります。
  • 呼び出すたびに、以前にアクセスしていたものはすべてキャッシュから削除されます。
  • 次に、現在アクセスしているものを追加します。
  • 次に、キャッシュ内の現在の状態に基づいて、同じものにアクセスしている他のユーザーのリストをコンパイルします。
  • ページが処理して表示するこのリストを返します。

誰かがいつページにアクセスしたかを記録する場合、サービスがページへのアクセスとして「カウント」を停止するまでのタイムアウトを設定できます。

于 2012-06-05T23:53:02.347 に答える