0

データベース テーブルに特定のイベントをキャプチャする PHP ベースの Web アプリケーションがあります。また、これらのキャプチャされたイベントの視覚化も備えています: ajax によって制御されるイベントを一覧表示する html テーブル。

オプションの「ライブ」機能を追加したいと思います。ボタンを押すと (「スイッチオン」)、その瞬間からキャプチャされたすべてのイベントが、既に表示されているテーブルに挿入されます。イベントの通知、イベント データの取得、テーブルへの挿入の 3 つを実行する必要があります。サーバーの負荷を適切な制限内に保つために、ajax リクエストで新しいイベントをポーリングしたくありません。代わりに、長いポーリング戦略を好みます。

これに伴う問題は明らかに、長いポーリング ajax 呼び出しを実行するときに、サーバーのカウンターパートがイベントを監視する必要があることです。イベントは php スクリプトによって登録されるため、データベースを再度ポーリングして変更を確認する以外に、そのイベントに気付く簡単な方法はありません。これは、長いポーリング リクエストの監視とは別のプロセスでキャプチャ アクションが実行されるためです。Linux のリッチ クライアントで知っているようなプロセス間通信に使用できるメカニズムを見つけようと、いろいろ調べました。実際、セマフォ、共有メモリ、さらには posix 用の php 拡張機能があります。ただし、それらはすべて Linux (または UNIX のような) システムにしか存在しません。通常ではありませんが、まれに MS-Windows システムでアプリケーションが使用されることがあります。

だから私の簡単な質問は: 長いポーリング ajax 要求を処理する php スクリプトにそのようなイベントをプッシュできるすべての (ほとんどの) システムで通常利用できる手段はありますか? 私はすでに他の場所でイベントを持っているので、ファイルやデータベースを常にポーリングせずに何か?

4

1 に答える 1

0

したがって、最初の警告: 「特別な」ことをせずに、バニラ PHP で長いポーリングを実行しようとすると、サーバーを強制終了するまでリソースを消費します。

ここでは、基本的な PHP ベースのロング ポーリングの基本的なガイドと、「単純な」道を進むことに関連するいくつかの課題について 説明します。基本的な「ロング ポーリング」を実装するにはどうすればよいですか?

これを実際にクロスプラットフォームで行う (そして開始するのに十分単純である) 限り、ある種の単純な内部ポーリングにフォールバックする必要があるかもしれませんが、目標は、このアクションがクライアントを持つよりもはるかに低コストであることを保証することです。世論調査。

1 つのルートは、データベース呼び出しをキャッシュしているように本質的に扱い (この時点で)、いくつかの標準的なキャッシュ アプローチを使用することです。APC から memcached、ファイルのポーリングに至るまで、クライアントが毎秒接続をセットアップして切断するよりも、サーバーにかかる負荷が少なくなる可能性があります。1 つのプロセスでデータを正しいキーに配置し、スクリプトで定期的にポーリングします。

これは、クロスプラットフォームで十分なさまざまなキャッシュオプションのかなり良い概要です: http://simas.posterous.com/php-data-caching-techniques

このアプローチの限界に達したら、おそらく別のサーバー アーキテクチャに移行する必要があります。

于 2012-08-07T00:41:46.090 に答える